在Nginx
中配置location
的匹配規則時,相信大家都遇到過 URL 去掉末尾斜槓(/)匹配失敗的情況。
我們先來舉例描述一下這個問題。
example配置
假設我們配置是這樣:
server {
listen 80
server_name xxx.com
...
...
location /yyy {
root /home/projects;
index index.html index.htm;
}
...
...
}
複製程式碼
那麼,如果我們訪問 xxx.com/yyy/ ,會匹配到伺服器上/home/projects/yyy
資料夾,並開啟index.html
或者index.htm
檔案。
而當我們訪問 xxx.com/yyy ,你會發現,匹配失敗
這種情況下,你當然可以祈禱使用者能夠每次輸入這個 URL 的時候都帶上(/),但是說實在的,我估計你每次開啟百度的時候都是直接輸入 www.baidu.com 而不會加斜槓輸入 www.baidu.com/ 。末尾斜槓顯得如此多此一舉。
那如何才能解決這個問題呢?
解決思路
既然加了斜槓可以匹配,那麼,我們就可以對不加斜槓的 URL 進行重寫,給它加上末尾斜槓,然後重定向,不就解決問題了。
這裡,我們需要用到 Nginx 中 ngx_http_rewrite_module 這個 module。
首先,我們判斷請求資源是否是請求目錄型別
if ( -d $request_filename )
複製程式碼
然後我們利用正則來匹配、替換,並用rewrite
中permanent
來重定向(301)
rewrite ^/(.*)([^/])$ $scheme://$host/$1$2/ permanent;
複製程式碼
正確配置
修改配置如下
server {
listen 80
server_name xxx.com
...
...
location /yyy {
root /home/projects;
if ( -d $request_filename ){
rewrite ^/(.*)([^/])$ $scheme://$host/$1$2/ permanent;
}
index index.html index.htm;
}
...
...
}
複製程式碼
然後驗證配置是否有錯誤
$ nginx -t
複製程式碼
如果沒有語法錯誤,會提示
/nginx.conf syntax is ok
最後重啟看效果
$ nginx -s reload
複製程式碼