没有散​​列“#”的 AngularJS 路由

IT技术 javascript angularjs
2021-01-17 14:13:08

我正在学习 AngularJS,但有一件事让我很恼火。

我用来$routeProvider为我的应用程序声明路由规则:

$routeProvider.when('/test', {
  controller: TestCtrl,
  templateUrl: 'views/test.html'
})
.otherwise({ redirectTo: '/test' });

但是当我在浏览器中导航到我的应用程序时,我看到的app/#/test不是app/test.

所以我的问题是为什么 AngularJS 会将此哈希添加#到 url 中?有没有可能避免它?

6个回答

实际上,对于非 HTML5 浏览器,您需要 #(hashtag)。

否则,他们只会在提到的 href 处对服务器进行 HTTP 调用。# 是一个旧的浏览器短路,它不会触发请求,它允许许多 js 框架在此基础上构建自己的客户端重新路由。

$locationProvider.html5Mode(true)如果可用,您可以使用告诉 angular 使用 HTML5 策略。

以下是支持 HTML5 策略的浏览器列表:http : //caniuse.com/#feat=history

对于 hashbang/pushstate/server-side 渲染 html 案例,Twitter 的一个很好读,engineering.twitter.com /2012/12/...它解释了他们如何设法做到这一点,因此它向后兼容旧浏览器和搜索引擎。我知道这不是 angularjs 特定的,但您可以重现流程。
2021-03-15 14:13:08
支持 HTML5 历史 API 的现代浏览器不需要主题标签。请参阅@skeep 的回答和提供的链接。在 HTML5 模式下,Angular 只会在浏览器不支持的情况下使用主题标签。另请注意,如果您不想,您不必使用 $routeProvider...您可以使用 ng-clicks 和 ng-include 连接您自己的路由(实际上,如果您需要多个级别的路由,因为 ng-view 每页只能出现一次)。另见stackoverflow.com/questions/12793609/...
2021-03-18 14:13:08
当您想跟踪应用程序状态时,它很有用。这些框架提供了一个历史机制。此外,它允许例如通过 url 共享直接访问应用程序的状态
2021-03-27 14:13:08
好的谢谢。这是我所怀疑的。但对我来说,这对用户非常不友好!假设我希望通过 url、app/res 提供一些资源。我网站的用户如何发现他们应该输入 app/#/res 来代替?
2021-04-01 14:13:08
但如果是这样,为什么我需要这些路径在位置栏中可见?如果用户不会使用它们,我可以制作单页 javascript 应用程序。
2021-04-07 14:13:08

如果您像其他人所说的那样启用了 html5mode,并创建一个.htaccess包含以下内容文件(根据您的需要进行调整):

RewriteEngine   On
RewriteBase     /
RewriteCond     %{REQUEST_URI} !^(/index\.php|/img|/js|/css|/robots\.txt|/favicon\.ico)
RewriteCond     %{REQUEST_FILENAME} !-f
RewriteCond     %{REQUEST_FILENAME} !-d
RewriteRule     ./index.html [L]

当用户输入正确的路线时,他们将被引导到您的应用程序,您的应用程序将读取路线并将他们带到其中的正确“页面”。

编辑:只要确保没有任何文件或目录名称与您的路由冲突。

从未使用过它们,但试试这个:stackoverflow.com/questions/5840497/convert-htaccess-to-nginx
2021-03-16 14:13:08
谢谢!没有这个,深层链接是不可能的。如果您需要深层链接,我仍然不确定漂亮或 URI 是否值得维护它,尤其是在某些云/paas 环境中,您可能无法轻松访问 httpd 配置。
2021-03-17 14:13:08
@chovy - 这里是 nGinx 版本: server { server_name my-app; 根/路径/到/应用程序;location / { try_files $uri $uri//index.html; } }
2021-03-23 14:13:08
记住 head 标签中的 <base href="/"></base>
2021-03-23 14:13:08
有这个的nginx版本吗?当我加载/about页面时失败,除非我通过应用程序访问它。
2021-03-30 14:13:08

让我们写一个看起来简单而简短的答案

在路由器末尾添加html5Mode(true) ;

app.config(function($routeProvider,$locationProvider) {

    $routeProvider.when('/home', {
        templateUrl:'/html/home.html'
    });

    $locationProvider.html5Mode(true);
})

在 html head 中添加base标签

<html>
<head>
    <meta charset="utf-8">    
    <base href="/">
</head>

感谢@plus - 详细说明上述答案

我一直无法让它发挥作用。我在以下位置发布了一个包含我的具体细节的新问题:stackoverflow.com/questions/36041074/...请看这个,如果你能提供帮助,我将不胜感激。
2021-04-01 14:13:08

尝试

$locationProvider.html5Mode(true)

更多信息在 $locationProvider
使用 $location

抱歉,我添加了 .config(function($locationProvider){ $locationProvider.html5Mode(true) }) 但我的结果是 index.html#%2Fhome 而不是 index.html/home
2021-03-29 14:13:08

以下信息来自:https :
//scotch.io/quick-tips/pretty-urls-in-angularjs-removing-the-hashtag

在 Angular 中获取干净的 URL 并从 URL 中删除主题标签非常容易。
默认情况下,AngularJS 将使用主题标签路由 URL 例如:

有两件事需要做。

  • 配置 $locationProvider

  • 设置我们的相对链接基础

  • $定位服务

在 Angular 中,$location 服务解析地址栏中的 URL 并对您的应用程序进行更改,反之亦然。

我强烈建议通读官方的 Angular $location 文档,以了解定位服务及其提供的内容。

https://docs.angularjs.org/api/ng/service/$location

$locationProvider 和 html5Mode

  • 我们将使用 $locationProvider module并将 html5Mode 设置为 true。
  • 我们将在定义 Angular 应用程序和配置路由时执行此操作。

    angular.module('noHash', [])
    
    .config(function($routeProvider, $locationProvider) {
    
       $routeProvider
           .when('/', {
               templateUrl : 'partials/home.html',
               controller : mainController
           })
           .when('/about', {
               templateUrl : 'partials/about.html',
               controller : mainController
           })
           .when('/contact', {
               templateUrl : 'partials/contact.html',
               controller : mainController
           });
    
       // use the HTML5 History API
       $locationProvider.html5Mode(true); });
    

什么是 HTML5 历史 API?这是使用脚本操纵浏览器历史记录的标准化方法。这让 Angular 可以在不刷新页面的情况下更改我们页面的路由和 URL。有关这方面的更多信息,这里有一篇很好的 HTML5 History API 文章:

http://diveintohtml5.info/history.html

相对链接的设置

  • 要使用相对链接围绕您的应用程序进行链接,您需要<base><head>文档的 中设置 。这可能位于 Angular 应用程序的根 index.html 文件中。找到该<base>标签,并将其设置为您的应用所需的根 URL。

例如: <base href="/">

  • 还有很多其他方法可以配置它,设置为 true 的 HTML5 模式应该会自动解析相关链接。如果您的应用程序的根目录与 url 不同(例如 /my-base,则将其用作基础。

旧浏览器的回退

  • 对于不支持 HTML5 History API 的浏览器,$location 服务将自动回退到 hashbang 方法。
  • 这对您来说是透明的,您无需对其进行任何配置即可工作。从 Angular $location 文档中,您可以看到回退方法及其工作原理。

综上所述

  • 这是获取漂亮 URL 并删除 Angular 应用程序中的主题标签的简单方法。玩得开心制作那些超级干净和超级快速的 Angular 应用程序!