解決Nginx中location匹配不到末尾不加斜槓的URL

Quenice發表於2018-09-28

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 )
複製程式碼

然後我們利用正則來匹配、替換,並用rewritepermanent來重定向(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
複製程式碼

相關文章