Angular学习第八天:angular路由去掉的URL里的#号

url 中存在#号

第六讲的时候我说过了,angular是通过浏览器地址栏的url(http://www.xxx.com/#/index) 号后面的部分#/index来确定当前用户访问的是哪个页面,然后根据这个URL对视图(ng-view)完成更新;并支持HTML5的历史记录功能。

  • angular的地址栏是什么样子?
http://www.xxx.com/
http://www.xxx.com/#/login
http://www.xxx.com/#/index
http://www.xxx.com/#/regsiter
  • 这跟我们平常见到的链接不一样(如http://www.xxx.com/admin/login), 这样就区分了这个路由是由angular管理的还是由webserver管理的。

总有强迫症患者想要去掉这个 # 号,那么angular可以去掉这个#号吗? 当然可以!!!!

  • angular 提供了一个 HTML5模式,启动这个路由模式就可以去掉路由中的 # 号 (即在配置路由时,注入 $locationProvider 服务,路由配置中加入如下代码 $locationProvider.html5Mode(true);)
var appH5 = angular.module('appH5', ['ngRoute']);
// 配置路由
appH5.config(['$routeProvider','$locationProvider',function($routeProvider,$locationProvider) {
  $routeProvider.otherwise({redirectTo: '/index'});
  $routeProvider
      .when('/index', {
          templateUrl: "views/index.html",
          controller:'indexCtrl'
      })
      .when('/regsiter', {
          templateUrl: "views/regsiter.html",
          controller:'regsiterCtrl'
      })
      .when('/message/:msgid', {
          templateUrl: "views/message.html",
          controller:'messageCtrl'
      });
      $locationProvider.html5Mode(true);//启用html5模式
}])
  • 做完以上的操作,我们就可以优雅的访问URL了???

http://www.xxx.com/#/login => http://www.xxx.com/login

尝试了之后发现,当我们直接打开 http://www.xxx.com/ 路由中配置默认重置到 /index $routeProvider.otherwise({redirectTo: '/index'});;没有问题,我们在页面中点击链接和通过$location.path()跳转也没有问题,但是当我们直接在地址栏输入 http://www.xxx.com/index; 然后你会看见下边的情况

Angular学习第八天:angular路由去掉的URL里的#号_第1张图片
2180072-c2642ff94ca33e9f.png

问题原因

刚刚说过,http://www.xxx.com/#/regsiter 和 http://www.xxx.com/admin/login这两个url用 # 区分了是angular还是webserver管理的url,当我们直接访问 http://www.xxx.com/login 没有#号 ,这个时候 webserver就尝试去解析,发现找不到对应的url,这个时候自然就抛出 404。

  • 找到问题,既然问题出在webserver解析不了,那我们何不把webserver解析不了的url都转发到angular应用里面?这不就皆大欢喜了

  • 解决办法 本人开发用的服务器是 nginx+js+html+css 前后端分离的方式
    1、修改SPA主入口 index.html(加入









2、开启html5模式

var appH5 = angular.module('appH5', ['ngRoute']);
// 配置路由
appH5.config(['$routeProvider','$locationProvider',function($routeProvider,$locationProvider) {
  $routeProvider.otherwise({redirectTo: '/index'});
  $routeProvider
      .when('/index', {
          templateUrl: "views/index.html",
          controller:'indexCtrl'
      })
      .when('/regsiter', {
          templateUrl: "views/regsiter.html",
          controller:'regsiterCtrl'
      })
      .when('/message/:msgid', {
          templateUrl: "views/message.html",
          controller:'messageCtrl'
      });
      $locationProvider.html5Mode(true);//启用html5模式
}])
  1. 配置nginx服务器(nginx-1.11.0/conf/nginx.conf)
server {
      listen       8088;
      server_name  localhost;

      #charset koi8-r;

      #access_log  logs/host.access.log  main;

      location / {
          root   C:\Git\app\router_demo;
          try_files $uri $uri/ /index.html =404;
      }
}

其他服务器(本人不用这些服务器,未经过验证,只做参考)

Apache的设置【.htaccess的写法】

RewriteEngine On
# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ – [L]

# If the requested pattern is file and file doesn’t exist, send 404
RewriteCond %{REQUEST_URI} ^(/[a-z_-s0-9.]+)+.[a-zA-Z]{2,4}$
RewriteRule ^ – [L,R=404]

# otherwise use history router
RewriteRule ^ /index.html

OK 问题解决

你可能感兴趣的:(Angular学习第八天:angular路由去掉的URL里的#号)