環境:nginx 版本為 1.2.6if (-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條規則去匹配規則,雖然性能影響并不大。
2 回答

明月笑刀無情
TA貢獻1828條經驗 獲得超4個贊
經過多次測試,自己搞明白了。
這三條規則并沒有什么問題,第二條也并不是我之前所說的有什么詭異的地方。
首先,nginx會根據用戶自定義的規則進行匹配,當你輸入的路徑存在且在最后不含有斜杠時,
由于我這個文件夾下存在index.php,所以$request_filename/index.php
匹配第二條規則成功,注意這里的/
,然后進行之后的匹配。也就是說,只要這個文件夾是存在的,且這個文件夾下有 index.html 或者 index.php 就會匹配我上面給出的第一條或者第二條規則,這沒有任何疑問。
所以,你如果想要在文件夾存在時不會進行第一或者二條規則之后的匹配且會自動加斜杠,解決辦法是在第一條規則之前加上一條對文件夾的判斷:
if (-d $request_filename){ rewrite ^/(.*)([^/])$ /$1$2/ permanent; }
這條規則的意思是,如果文件夾存在且沒有斜杠時自動加斜杠并進行301跳轉,OK,問題解決。

侃侃爾雅
TA貢獻1801條經驗 獲得超16個贊
最后一條的邏輯是,在不滿足前面條件的情況下,“如果訪問的路徑不是文件”就自動跳轉到/index.php。
建議:在第三條之前插入一句 -e 檢測是否是文件夾,如果是,自動加斜杠,break。
未測試,僅供參考。
- 2 回答
- 0 關注
- 218 瀏覽
添加回答
舉報
0/150
提交
取消