angularjs - html5mode不是预期的行为

时间:2016-08-05 13:44:36

标签: angularjs nginx url-rewriting routes

我正在尝试使用html5mode。我这样使用:

我在'head'标签中使用'base'标记并在'/'上设置href(不能在HTML中写这个...)

我的主要模块正在处理下面的路线:

angular.module('MyChef', [
    'Authentication',
    'Home',
    'UserArea',
    'ngRoute',
    'ngCookies'
])

.config(['$routeProvider', '$locationProvider', function ($routeProvider,$locationProvider) {

    $routeProvider
        .when('/login', {
            controller: 'LoginController',
            templateUrl: 'modules/authentication/views/login.html'
        })

        .when('/', {
            controller: 'HomeController',
            templateUrl: 'modules/home/views/home.html'
        })

        .when('/home', {
            controller: 'HomeController',
            templateUrl: 'modules/home/views/home.html'
        })


        .when('/user-area', {
            controller: 'UserAreaController',
            templateUrl: 'modules/user-area/views/user-area.html'
        })


        .otherwise({ redirectTo: '/' });

        $locationProvider.html5Mode({
                     enabled: true,
                     requireBase: false,
        });
}]).run(//doesn't matter I guess...);

正如您所看到的,我正在尝试使用'requireBase'设置为'false'来忽略路径中的哈希,但是无效。

我的nginx配置文件:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/site/public;

    server_name mychefake.com.br;


    location / {
        index index.html;
        try_files $uri $uri/ =404;
    }


  location /api {
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#    proxy_set_header X-Forwarded-Port 443; #this is important for Catalyst Apps!
      rewrite /api(.*) /$1  break;
    proxy_pass http://localhost:5000; #changed from http://localhost:5000/
  }


}

行为:

当我访问类似:http://localhost

的内容时

我被重定向到'/ login'(如果我没有登录)。没关系!

但是,如果我尝试在没有“#”的情况下重新加载此页面,我的脸上就有404页面。为什么呢?

我想我需要在nginx配置文件上做一些事情(也许是重写)。我是对的还是我可以直接在AngularJS上做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:0)

这是因为当您将请求发送到服务器时,它不知道您请求的文件不存在,并且路由正在前端内进行。您必须修改.htaccess,以便将所有请求路由到一个文件。

RewriteEngine On
Options FollowSymLinks

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /#/$1 [L]

答案 1 :(得分:0)

在nginx配置文件中的位置会话:

http

这个有效!但这不是最好的方式(实际上是一种愚蠢的方式)。我需要更好的解决方案。我试过条件重写,但是nginx'大喊大叫':D。还有其他人吗?