您好,匿名用户
随意问技术百科期待您的加入

nginx 目录后面斜杠问题

0 投票

环境:nginx 版本为 1.2.6
最近在做项目时遇到一个奇怪的问题,因为要重新设计url,所以用到了以下nginx重写规则:

if (-f $request_filename/index.html){
  rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
  rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
  rewrite (.*) /index.php;
}

这个重写规则已经普遍使用,我也不知道有没有什么地方不妥~(求指点)

在我没有使用这些规则时,访问服务器上一个存在的目录时会自动加个斜杠,这时触发了nginx自动的rewrite规则,这很正常,没有问题。

但是我加了上面这些规则后,访问服务器上已经存在的文件夹时就不会自动加斜杠了,而且,在我反复测试后,发现是第2、3条规则在作怪:

1、如果只把第2条规则删除,那么不无论你文件夹存不存在都会检测成不存在,而且不会加斜杠,并且会直接进入第3条规则,最终匹配进入index.php,可以得知,此时是按文件来处理的。

2、如果把第2条规则删除,第3条规则对文件的判断 -f 改为 -e,即文件或文件夹:

if (!-e $request_filename){
  rewrite (.*) /index.php;
}

这时,问题得以解决,目录存在时会自动加斜杠,不存在时会匹配进入到index.php,这正是我想要的。

我很不解,求大师指点,为什么会是这个样子呢?

另外,由于项目原有的一些问题,在第3条规则里面还有一大坨其它针对性的重写规则,所以我并不希望在输入的是文件夹而且存在时还会进入第3条规则去匹配规则,虽然性能影响并不大。

用户头像 提问 2014年 5月14日 @ Mordekaiser 上等兵 (232 威望)
分享到:

1个回答

0 投票
 
最佳答案

经过多次测试,自己搞明白了。

这三条规则并没有什么问题,第二条也并不是我之前所说的有什么诡异的地方。

首先,nginx会根据用户自定义的规则进行匹配,当你输入的路径存在且在最后不含有斜杠时,
由于我这个文件夹下存在index.php,所以$request_filename/index.php匹配第二条规则成功,注意这里的/,然后进行之后的匹配。也就是说,只要这个文件夹是存在的,且这个文件夹下有 index.html 或者 index.php 就会匹配我上面给出的第一条或者第二条规则,这没有任何疑问。

所以,你如果想要在文件夹存在时不会进行第一或者二条规则之后的匹配且会自动加斜杠,解决办法是在第一条规则之前加上一条对文件夹的判断:

if (-d $request_filename){
   rewrite ^/(.*)([^/])$ /$1$2/ permanent;
}

这条规则的意思是,如果文件夹存在且没有斜杠时自动加斜杠并进行301跳转,OK,问题解决。

用户头像 回复 2014年 5月14日 @ Alistar 上等兵 (326 威望)
选中 2013年 9月7日 @Mordekaiser
提一个问题:

相关问题

0 投票
1 回复 30 阅读
用户头像 提问 2012年 12月1日 @ Poppy 上等兵 (395 威望)
0 投票
1 回复 30 阅读
用户头像 提问 2013年 12月23日 @ Ares 上等兵 (353 威望)
0 投票
1 回复 1,638 阅读
0 投票
1 回复 36 阅读
用户头像 提问 2014年 2月17日 @ Nero 上等兵 (377 威望)
0 投票
1 回复 28 阅读
用户头像 提问 2014年 1月11日 @ 我和小伙伴们都惊呆了 上等兵 (156 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...