nginx rewrite

介紹rewrite之前先說一下一些相關的操作指令。

if指令

if指令用來支持條件判斷,其語法結構如下:

if (condition) {...}

{…}中的爲滿足條件時要執行的配置設置。
if指令可存在於server塊和location塊中,可以使用以下符號進行比較判斷:

=       等於
!=      不等於
~      大小寫敏感的模糊匹配
~*     大小寫不敏感的模糊匹配
-f      請求的文件是否存在
-d      請求的目錄是否存在
-e      請求的文件或目錄是否存在
-x      請求的文件是否可執行

每個操作具有"非"權限,如"!~"、"!-f"等

例如判斷用戶的瀏覽器是否爲IE(比較新的IE版本已經匹配不到了),則可以使用以下方式:

if ($http_user_agent ~ MSIE) {...}

根據用戶請求方式的不同而使用不同的配置:

if ($request_method = GET) {...}
if ($request_method = POST) {...}

break指令

break指令可存在於server塊、location塊、if塊中,作用是直接跳出當前作用域,在存在break的作用域中,break之前的配置生效,break之後的配置將不會生效。

return指令

return指令用於完成對請求的處理,直接向客戶端返回相關信息,處於該指令後的nginx配置都是無效的,該指令可用於server塊、location塊、if塊中。
支持以下語法結構:

return [text]   #返回給客戶端的響應體內容,可使用變量
return code URL;    #返回給客戶端的HTTP狀態碼
return URL;     #返回給客戶端的URL地址

rewrite指令

rewrite指令是實際用來進行rewrite功能配置的具體指令,使用正則表達式的方法來改變URI,可同時存在1個或多個指令,按照順序依次進行處理。
rewrite指令可以在server塊或location塊中進行配置,語法結構如下:

rewrite regex replacement [flag];

參數說明:

  • regex:正則表達式,使用()標記要截取的內容,使用$1~$9獲取截取到的內容;
  • replacement:匹配成功後用於替換被截取內容的字符串,即重寫後的地址,如果該字符串是由http(s)開頭的,則直接返回此URI給客戶端,不再繼續向下處理。
  • flag:設置rewrite對URI的處理行爲,有4種標誌可設置,分別爲:
    last:終止繼續在本location塊中處理URI,將重寫後的URI重新在server塊中執行,提供了重寫後的URI轉入到其它location塊中的機會;
    break:重寫後的URI繼續在本location塊中執行,不會轉入到其它的location塊中;
    redirect:重寫後的URI返回給客戶端,狀態代碼爲203,指明是臨時重定向URI,主要用在replacement不是以http(s)開頭的情況下;
    permanent:重寫後的URI返回給客戶端,狀態代碼爲301,指明是永久重定向URI;

set指令

set指令用來設置新的變量,語法結構如下:

set $variable value

示例

下面來看一些具體的例子:
例1

server {
        listen 7777;
        if ($http_user_agent !~ MSIE) {
            rewrite ^/ http://10.0.0.33/Api$uri;
        }
}

$uri是全局變量,與$document_uri含義相同,截取的都是host後的部份。
chrome訪問”http://10.0.0.1:7777/a.php?num=99“,會被rewrite成”http://10.0.0.33/Api/a.php?num=99“。

例2

server {
    listen 7777;
    if ($request_method = GET) {
        rewrite ^/ http://10.0.0.33/get$uri;
    }
}

訪問”http://10.0.0.1:7777/a.php?cc=9c9c“,會被rewrite成”http://10.0.0.33/get/a.php?cc=9c9c“。

例3

server {
        listen 7777;
        location ^~ /Api
        {
                rewrite ^/Api(.*) http://10.0.0.33/mapi$1;
        }

        location ^~ /User
        {
                rewrite ^/User(.*) http://10.0.0.33/ss$1;
        }

}

使用http://10.0.0.1:7777/Api/a.php進行請求訪問,會被重寫爲http://10.0.0.33/mapi/a.php。同樣,使用http://10.0.0.1:7777/User/b.php進行請求訪問,會被重寫爲http://10.0.0.33/ss/b.php


常用的nginx rewrite重寫規則

本文提供一些常用的rewrite重寫規則,用來美化網頁的鏈接。規則裏面的$1$2你不知道是怎麼來的話,只要記住,第一個()裏面的是$1,第二個()裏面的是$2.
請求的URL是給人看的,重寫後的URL是給電腦看的。

執行搜索

這個規則的目的是爲了執行搜索,搜索URL中包含的關鍵字。

請求的URL	//hqidi.com/search/some-search-keywords
重寫後URL	//hqidi.com/search.php?p=some-search-keywords
重寫規則	        rewrite ^/search/(.*)$ /search.php?p=$1?;

用戶個人資料頁面

大多數運行訪問者註冊的動態網站都提供一個可以查看個人資料的頁面,這個頁面的URL包含用戶的UID和用戶名

請求的URL	//hqidi.com/user/47/dige
重寫後URL	//hqidi.com/user.php?id=47&name=dige
重寫規則	        rewrite ^/user/([0-9]+)/(.+)$ /user.php?id=$1&name=$2?;

多個參數

有些網站對字符串參數使用不同的語法,例如 通過斜線“/”來分隔非命名參數

請求的URL	//hqidi.com/index.php/param1/param2/param3
重寫後URL	//hqidi.com/index.php?p1=param1&p2=param2&p3=param3
重寫規則	        rewrite ^/index.php/(.*)/(.*)/(.*)$ /index.php?p1=$1&p2=$2&p3=$3?;

類似百科的格式

這種格式特點,一個前綴目錄,後跟文章名稱

請求的URL	//hqidi.com/wiki/some-keywords
重寫後URL	//hqidi.com/wiki/index.php?title=some-keywords
重寫規則	        rewrite ^/wiki/(.*)$ /wiki/index.php?title=$1?;

論壇

論壇一般用到兩個參數,一個話題標識(topic)一個出發點(starting post)

請求的URL	//hqidi.com/topic-1234-50-some-keywords.html
重寫後URL	//hqidi.com/viewtopic.php?topic=1234&start=50
重寫規則        	rewrite ^/topic-([0-9]+)-([0-9]+)-(.*)\.html$ viewtopic.php?topic=$1&start=$2?;

新網站的文章

這種URL結構的特點,由一個文章標識符,後跟一個斜線,和一個關鍵字列表組成。

請求的URL	//hqidi.com/88/future
重寫後URL	//hqidi.com/atricle.php?id=88
重寫規則	        rewrite ^/([0-9]+)/.*$ /aticle.php?id=$1?;

最後一個問號

若被替換的URI中含有參數(類似/app/test.php?id=5之類的URI),默認情況下參數會被自動附加到替換串上,可以通過在替換串的末尾加上?標記來解決這一問題。

rewrite ^/users/(.*)$ /show?user=$1? last;

比較一個加上標記和不加標記的URL跳轉區別:

rewrite ^/test(.*)$ //hqidi.com/home premanent;

訪問//hqidi.com/test?id=5 經過301跳轉後的URL地址爲 //hqidi.com/home?id=5

rewrite ^/test(.*)$ //hqidi.com/home? premanent;

訪問//hqidi.com/test?id=5 經過301跳轉後的URL地址爲 //hqidi.com/home

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章