nginx 使用正則表達式將特定網址重導向
最近遇到一個問題,要將特定的網址重導向,
例如將 http://domain/data/1234/ 重導向為 http://domain/data/1234/data.json。
本來想說還要靠後端服務來處理,
後來想到 nginx 應該有支援重導向的功能,
可以使用 301 Redirect 設定:
location /data/1234/ {
return 301 /data/1234/data.json
}
但是上面範例中的 1234 只是其中一個可能性,實際上是不定長度的數字,
所以接下來要使用正則表達式 (Regular Expression) 來解析想要的網址。
解析條件如下:
http://domain/data/{number}/
其中 http://domain 是根目錄,後面的 /data/ 是固定的,接著 {number} 是不定長度的數字,
最後結尾有個 / 是不一定要有的(考慮到有人可能不想打這個字),所以加上 ? 表示可有可無。
上述條件的 regex 表示如下:
^\/data/[0-9]+\/?
因為要將數字的部份當成變數,所以要加上 () 括號,
在 nginx 的設定檔 /etc/nginx/nginx.conf 加上
location ~ '^\/data/([0-9]+)\/?' {
return 301 /data/$1/data.json
}
上面這樣就可以成功轉址,但是執行後卻發生錯誤了!
「此網站包含重新導向迴圈」
原來我們重導向後的網址 http://domain/data/1234/data.json 還是符合 regex 裡面的絛件啊!
於是要在條件的最後加上一個 $ 代表結尾,這樣就不會一直在迴圈中跑不出來嘍。
location ~^\/data\/([0-9]+)\/?$ {
return 301 /data/$1/data.json
}
相關文章:
Arch Linux nginx 安裝
資料來源:
How to redirect single url in nginx?
http://stackoverflow.com/questions/18037716/how-to-redirect-single-url-in-nginx
Basic Nginx Configuration
https://www.linode.com/docs/websites/nginx/basic-nginx-configuration
沒有留言:
張貼留言