code-prettify

2015年5月21日 星期四

nginx 使用正則表達式將特定網址重導向

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

沒有留言:

張貼留言