Angularjs Nginx 403特定角度路线错误
因此,我有一个角度应用程序,有几个路线,我可以很容易地得到 然而,当我遇到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) {
/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文件夹移到其他位置,这应该可以解决问题。此外,我还挖掘了您的用户名!