Angularjs Nginx 403特定角度路线错误

Angularjs Nginx 403特定角度路线错误,angularjs,nginx,url-rewriting,vagrant,Angularjs,Nginx,Url Rewriting,Vagrant,因此,我有一个角度应用程序,有几个路线,我可以很容易地得到 然而,当我遇到403错误时,/admin避开了我。工作路线的一个示例,在/articles加载时以完全相同的方式进行设置 以下是我的应用程序配置: app.config(['$stateProvider', '$locationProvider', '$urlRouterProvider', function($stateProvider, $locationProvider, $urlRouterProvider) {

因此,我有一个角度应用程序,有几个路线,我可以很容易地得到

然而,当我遇到403错误时,
/admin
避开了我。工作路线的一个示例,在
/articles
加载时以完全相同的方式进行设置

以下是我的应用程序配置:

    app.config(['$stateProvider', '$locationProvider', '$urlRouterProvider',
    function($stateProvider, $locationProvider, $urlRouterProvider) {
        $stateProvider.
            ...
            state('articles', {
                url: '/articles',
                templateUrl: 'components/articles/templates/articles.tmpl.html',
                controller: 'ArticleController'
            }).
            state('articles/:id', {
                url: '/articles/:id',
                templateUrl: 'components/articles/templates/single-article.tmpl.html',
                controller: 'ArticleController'
            }).
            state('admin', {
                url: '/admin',
                templateUrl: 'admin/templates/admin.tmpl.html',
                controller: 'AdminController'
            }).
            state('admin.create', {
                url: '/create',
                templateUrl: 'admin/create/templates/create.tmpl.html',
                controller: 'AdminCreateController'
            }).
            ...
        $urlRouterProvider.otherwise('/');
        $locationProvider.html5Mode(true);
    }
]);
我知道罪魁祸首是Nginx,而且我知道它是由HTML5模式触发的;因此,我查看了我是如何重新路由到索引页的,它看起来很好(并且在站点上正常工作),这是我的nginx站点可用配置:

server {

   listen 80;
   server_name app.local.dev;
   root "/vagrant/app";
   index index.html;
   location / {
       try_files $uri $uri/ /index.html;

   }

}
以下是Nginx的错误日志示例:

2015/02/06 06:14:23 [error] 3361#0: *20 directory index of "/vagrant/app/admin/" is forbidden, client: 192.168.99.1,
我似乎对我的文件结构没有任何权限(文件所在的根文件夹
/admin
为:

-rw-r--r-- 1 vagrant vagrant  229 Feb  2 20:33 AdminController.js
-rw-rw-r-- 1 vagrant vagrant   90 Feb  2 05:18 AdminModule.js
drwxr-xr-x 1 vagrant vagrant  204 Feb  3 02:55 create
-rw-r--r-- 1 vagrant vagrant 6148 Feb  2 16:08 .DS_Store
drwxr-xr-x 1 vagrant vagrant  170 Feb  3 05:12 edit
drwxr-xr-x 1 vagrant vagrant  102 Feb  2 20:33 templates
-rw-r--r-- 1 vagrant vagrant 715 Feb  5 03:47 ArticleController.js
-rw-r--r-- 1 vagrant vagrant  94 Dec  3 18:29 ArticleModule.js
drwxr-xr-x 1 vagrant vagrant 136 Feb  6 04:19 templates
/admin
模板文件:

-rw-r--r-- 1 vagrant vagrant 151 Feb  2 20:33 admin.tmpl.html
/articles
文件所在的根文件夹:

-rw-r--r-- 1 vagrant vagrant  229 Feb  2 20:33 AdminController.js
-rw-rw-r-- 1 vagrant vagrant   90 Feb  2 05:18 AdminModule.js
drwxr-xr-x 1 vagrant vagrant  204 Feb  3 02:55 create
-rw-r--r-- 1 vagrant vagrant 6148 Feb  2 16:08 .DS_Store
drwxr-xr-x 1 vagrant vagrant  170 Feb  3 05:12 edit
drwxr-xr-x 1 vagrant vagrant  102 Feb  2 20:33 templates
-rw-r--r-- 1 vagrant vagrant 715 Feb  5 03:47 ArticleController.js
-rw-r--r-- 1 vagrant vagrant  94 Dec  3 18:29 ArticleModule.js
drwxr-xr-x 1 vagrant vagrant 136 Feb  6 04:19 templates
/articles
模板文件:

-rw-r--r-- 1 vagrant vagrant 526 Feb  6 04:19 articles.tmpl.html
-rw-r--r-- 1 vagrant vagrant 453 Feb  5 22:35 single-article.tmpl.html
因此,我可以点击我的主域名,在没有散列的情况下获取我的主页,点击周围并维护一个不包含散列的漂亮url(HTML5模式),并且(除了
/admin
)能够点击刷新并通过Angular正确地重新加载该状态

但是如果我在我的
app.config
中将管理员状态更改为
/admins
的url,它将神奇地工作,重新加载将正确刷新
/admins
,并显示正确的视图

state('admin', {
    url: '/admins', // works as expected and loads what was my /admin view with correct refreshing in Nginx
    templateUrl: 'admin/templates/admin.tmpl.html',
    controller: 'AdminController'
}).

那么Nginx中是否存在某种奇怪的保留URL呢?我使用的是Vagrant,并且专门关闭了sendfile作为许多报告奇数缓存。我的Nginx.conf设置是否错误?我觉得我的URL重写工作正常,因为它在站点上的其他任何地方都能正常工作。路由工作的唯一区别是
/articles
和一个不
/admin
的是
/admin
中有嵌套状态,例如
/admin/create/pages/

似乎您的逻辑路径与“物理”路径冲突

UiRouter拦截客户端上的请求。每次尝试获取“foo.bar/admin”时,它都会检查路由表并说“嗯,这是注册为逻辑路径(客户端),因此不需要查询服务器”。 问题是,当您直接请求“foo.bar/admin”而不是导航到它时,nginx是第一个获得请求的(因为uiRouter甚至不会被加载),并且由于您在服务器中使用相同的路径来存储文件,而不是返回index.html文件,您的另一个

规则try_文件$uri$uri/

有优先权并试图在服务器上找到它。但当然,它找不到它,因为那里没有“管理”文件。我相信它不是404,因为路径实际上存在于服务器上,但它是一个目录,因此它无法返回它,因此它感测403

一种可能的解决方案是避免路径冲突,就像您将“admin”重命名为“admins”时所做的那样。由于nginx在服务器上找不到“admins”,它会回退到index.html

另一种解决方案是使用gulp或grunt之类的东西来压缩文件,并避免有多个目录(从而避免路径冲突)


最后,您可以重写一些规则,以便将/admin重定向到index.html…但我不同意。另外两个是更好的选择。

遗憾的是,我对angular没有太多经验,但我可以说,当您请求像
/admin
这样的url时,nginx会检查您在
try\u文件中指定的规则,这是是

$uri # check if there's a file called admin
当然你没有,所以它会进入下一步

$uri/ #check if there's a directory called admin
它被找到了,因为您只提供了一个目录,所以它可以从中检查索引

index index.html;
所以nginx尝试查找
/admin/index.html
,我假设它不存在,所以nginx返回到最后一件事,即目录列表,但是由于您没有
上的
自动索引,它返回到
403
错误,因为不允许使用目录索引

如果您想跳过此步骤并提供
index.html
我假设它有一些与angular相关的代码,那么我建议的解决方案是完全删除
$uri/
部分,因此最后的
try\u files
行将是

try_files $uri /index.html;

Makes-since;由于根级别上实际上有一个“/admin”,因此无法找到索引。我将把admin文件夹移到其他位置,这应该可以解决问题。此外,我还挖掘了您的用户名!