从AngularJS urls中删除片段标识符(#符号)

时间:2013-02-08 11:01:24

标签: angularjs url ngroute

是否可以从angular.js网址中删除#符号?

当我更改视图并使用params更新URL时,我仍然希望能够使用浏览器的后退按钮等,但我不想要#符号。

教程routeProvider声明如下:

angular.module('phonecat', []).
  config(['$routeProvider', function($routeProvider) {
  $routeProvider.
  when('/phones', {templateUrl: 'partials/phone-list.html',   controller: PhoneListCtrl}).
  when('/phones/:phoneId', {templateUrl: 'partials/phone-detail.html', controller: PhoneDetailCtrl}).
  otherwise({redirectTo: '/phones'});
}]);

我可以编辑它以在没有#?

的情况下具有相同的功能

14 个答案:

答案 0 :(得分:248)

是的,您应该配置$locationProvider并将html5Mode设置为true

angular.module('phonecat', []).
  config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) {

    $routeProvider.
      when('/phones', {templateUrl: 'partials/phone-list.html',   controller: PhoneListCtrl}).
      when('/phones/:phoneId', {templateUrl: 'partials/phone-detail.html', controller: PhoneDetailCtrl}).
      otherwise({redirectTo: '/phones'});

    $locationProvider.html5Mode(true);

  }]);

答案 1 :(得分:55)

请务必检查html5历史记录API的浏览器支持:

  if(window.history && window.history.pushState){
    $locationProvider.html5Mode(true);
  }

答案 2 :(得分:45)

要删除漂亮网址的哈希标记以及代码在缩小后工作,您需要 像下面的例子那样构建你的代码:

jobApp.config(['$routeProvider','$locationProvider',
    function($routeProvider, $locationProvider) {
        $routeProvider.
            when('/', {
                templateUrl: 'views/job-list.html',
                controller: 'JobListController'
            }).
            when('/menus', {
                templateUrl: 'views/job-list.html',
                controller: 'JobListController'
            }).
            when('/menus/:id', {
                templateUrl: 'views/job-detail.html',
                controller: 'JobDetailController'
            });

         //you can include a fallback by  including .otherwise({
          //redirectTo: '/jobs'
        //});


        //check browser support
        if(window.history && window.history.pushState){
            //$locationProvider.html5Mode(true); will cause an error $location in HTML5 mode requires a  tag to be present! Unless you set baseUrl tag after head tag like so: <head> <base href="/">

         // to know more about setting base URL visit: https://docs.angularjs.org/error/$location/nobase

         // if you don't wish to set base URL then use this
         $locationProvider.html5Mode({
                 enabled: true,
                 requireBase: false
          });
        }
    }]);

答案 3 :(得分:18)

$locationProvider.html5Mode(true)中设置app.js后,我在web.config中写了一条规则。

希望,帮助别人。

  <system.webServer>
    <rewrite>
      <rules>
        <rule name="AngularJS" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
          </conditions>
          <action type="Rewrite" url="/" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>

在我的index.html中,我将其添加到<head>

<base href="/">

别忘了在服务器上安装iis的url rewriter。

此外,如果您使用Web Api和IIS,此匹配网址将无法解决,因为它将更改您的api调用。因此,添加第三个输入(第三行条件)并提供一个模式,该模式将排除来自www.yourdomain.com/api

的调用

答案 4 :(得分:10)

如果您使用AngularJS与MVC进行.NET堆栈,那么您需要从URL中删除“#”:

  1. 在_Layout页面中设置基本href:<head> <base href="/"> </head>

  2. 然后,在角度应用配置中添加以下内容:$locationProvider.html5Mode(true)

  3. 上面会从网址中删除“#”,但页面刷新功能不起作用,例如如果你在“yoursite.com/about”页面,refreash将给你一个404.这是因为MVC不知道角度路由,并且通过MVC模式它将寻找MVC页面的'about',这在MVC中是不存在的路由路径。解决方法是将所有MVC页面请求发送到单个MVC视图,您可以通过添加捕获所有

  4. 的路由来实现。

    url:

    routes.MapRoute(
        name: "App",
        url: "{*url}",
        defaults: new {
            controller = "Home", action = "Index"
        }
    );
    

答案 5 :(得分:5)

您可以调整html5mode,但这仅适用于页面的html锚点中包含的链接以及网址在浏览器地址栏中的显示方式。尝试从页面外的任何位置请求没有主题标签(带或不带html5mode)的子页面将导致404错误。例如,以下CURL请求将导致页面未找到错误,无论html5mode如何:

$ curl http://foo.bar/phones

虽然以下内容将返回root / home页面:

$ curl http://foo.bar/#/phones

这样做的原因是在请求到达服务器之前删除了hashtag之后的任何内容。因此http://foo.bar/#/portfolio请求作为http://foo.bar请求到达服务器。服务器将以http://foo.bar的200 OK响应(大概)响应,代理/客户端将处理其余的响应。

因此,如果您想与其他人共享网址,则除了包含主题标签外别无选择。

答案 6 :(得分:5)

遵循2个步骤 -
1.首先在应用配置文件中设置 $ locationProvider.html5Mode(true)
例如 -
 angular.module('test', ['ui.router']) .config(function($stateProvider, $urlRouterProvider, $locationProvider) { $locationProvider.html5Mode(true); $urlRouterProvider.otherwise('/'); });

2.在主页面内设置&lt; base&gt; 例如 - &gt;
<base href="/">

对于不支持HTML5历史记录API的浏览器,$ location服务将自动回退到哈希部分方法。

答案 7 :(得分:3)

我的解决方案是创建.htaccess并使用#Sorian代码..没有.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]

答案 8 :(得分:1)

根据文件。您可以使用:

$locationProvider.html5Mode(true).hashPrefix('!');
  

注意:如果您的浏览器不支持HTML 5.请不要担心:D它有   回退到hashbang模式。因此,您不需要手动检查if(window.history && window.history.pushState){ ... }

例如:如果您点击:<a href="/other">Some URL</a>

在HTML5浏览器中: angular会自动重定向到example.com/other

非HTML5浏览器: angular会自动重定向到example.com/#!/other

答案 9 :(得分:1)

这个答案假设您使用nginx作为反向代理,并且您已经将$ locationProvider.html5mode设置为true。

- &gt;对于那些可能仍在为上述所有酷炫事物而苦苦挣扎的人。

当然,@ maxim grach解决方案工作正常,但是对于如何响应不希望首先包含主题标签的请求的解决方案,可以做的是检查php是否正在发送404和然后重写网址。以下是nginx的代码,

在php位置,检测404 php错误并重定向到另一个位置,

location ~ \.php${
  ...
  fastcgi_intercept_errors on;
  error_page 404 = /redirect/$request_uri ;
}

然后在重定向位置重写网址,并将数据下载到proxy_pass,从而将您的网站网址放在我博客的网址上。 (请求:仅在您尝试后才对此进行提问)

location /redirect {
  rewrite ^/redirect/(.*) /$1;
  proxy_pass http://www.techromance.com;
}

看到魔力。

它绝对有效,至少对我而言。

答案 10 :(得分:1)

从index.html开始删除#中的所有<a href="#/aboutus">About Us</a>,因此它必须与<a href="/aboutus">About Us</a>类似。现在在index.html的head标记中,在最后一个之后写<base href="/"> em>元标记。

现在在您的路由js中注入$locationProvider并写入$locatonProvider.html5Mode(true); 这样的事情: -

app.config(function ($routeProvider, $locationProvider) {
    $routeProvider
        .when("/home", {
            templateUrl: "Templates/home.html",
            controller: "homeController"
        })
            .when("/aboutus",{templateUrl:"Templates/aboutus.html"})
            .when("/courses", {
                templateUrl: "Templates/courses.html",
                controller: "coursesController"
            })
            .when("/students", {
                templateUrl: "Templates/students.html",
                controller: "studentsController"
            })
        $locationProvider.html5Mode(true);
    });

有关详细信息,请观看此视频 https://www.youtube.com/watch?v=XsRugDQaGOo

答案 11 :(得分:1)

猜想这真的太迟了。但是,将以下配置添加到app.module导入即可完成工作:

RouterModule.forRoot(routes, { useHash: false })

答案 12 :(得分:0)

第1步:将$ locationProvider服务注入app config的构造函数

第2步:将代码行$ locationProvider.html5Mode(true)添加到app config的构造函数中。

步骤3:在容器(登陆,主页或布局)页面中,在标记内添加<base href="/">等html标记。

第4步:删除所有&#39;#&#34;用于从所有锚标签路由配置。例如,href =&#34; #home&#34;成为href =&#34; home&#34 ;; HREF =#&34;#大约&#34;成为herf =&#34; about&#34 ;; HREF =&#34;#接触&#34;变成href =&#34;联系&#34;

 <ul class="nav navbar-nav">
     <li><a href="home">Home</a></li>
     <li><a href="about">About us</a></li>
     <li><a href="contact">Contact us</a></li>
</ul>

答案 13 :(得分:-1)

只需添加public class Product { private String _description; private String _name; private double _price; private Long _productId; private int _quantity; public class Order { private Long _orderId; private List<OrderProduct> _productList; private User _user; public class OrderProduct { private Order _order; private Product _product; In

即可
$locationProvider

然后添加.config(function ($routeProvider,$locationProvider) 之后

$locationProvider.hashPrefix('');

就是这样。