nginx URL重寫規則配置詳解

轉載:http://blog.itpub.net/31559985/viewspace-2638621/

rewrite模塊介紹:

nginx的重寫模塊是一個簡單的正則表達式匹配與一個虛擬堆疊機結合。依賴於PCRE庫,因此需要安裝pcre。根據相關變量重定向和選擇不同的配置,從一個location跳轉到另一個location,不過這樣的循環最多可以執行10次,超過後nginx將返回500錯誤。同時,重寫模塊包含set指令,來創建新的變量並設其值,這在有些情景下非常有用的,如記錄條件標識、傳遞參數到其他location、記錄做了什麼等等。

rewrite模塊指令:

break
語法:break
默認值:none
使用字段:server, location, if

作用:完成當前設置的重寫規則,停止執行其他的重寫規則。

if
語法:if (condition) { … }
默認值:none
使用字段:server, location

注意:儘量考慮使用trp_files代替。

判斷的條件可以有以下值:

一個變量的名稱:空字符串”“或者一些“0”開始的字符串爲false。
字符串比較:使用=或!=運算符
正則表達式匹配:使用~(區分大小寫)和~*(不區分大小寫),取反運算!~ 和!~*。
文件是否存在:使用-f和!-f操作符
目錄是否存在:使用-d和!-d操作符
文件、目錄、符號鏈接是否存在:使用-e和!-e操作符
文件是否可執行:使用-x和!-x操作符

return
語法:return code
默認值:none
使用字段:server, location, if

按照相關的正則表達式與字符串修改URI,指令按照在配置文件中出現的順序執行。可以在重寫指令後面添加標記。

注意:如果替換的字符串以http://開頭,請求將被重定向,並且不再執行多餘的rewrite指令。

尾部的標記(flag)可以是以下的值:

last – 停止處理重寫模塊指令,之後搜索location與更改後的URI匹配。
break – 完成重寫指令。
redirect – 返回302臨時重定向,如果替換字段用http://開頭則被使用。
permanent – 返回301永久重定向。

rewrite_log
語法:rewrite_log on | off
默認值:rewrite_log off
使用字段:server, location, if
變量:無

啓用時將在error log中記錄notice級別的重寫日誌。

set
語法:set variable value
默認值:none
使用字段:server, location, if

爲給定的變量設置一個特定值。

uninitialized_variable_warn
語法:uninitialized_variable_warn on|off
默認值:uninitialized_variable_warn on
使用字段:http, server, location, if

控制是否記錄未初始化變量的警告信息。

重寫規則組成部分:

第一部分–正則表達式

可以使用括號來捕獲,後續可以根據位置來將其引用,位置變量值取決於捕獲正則表達式中的順序,$1引用第一個括號中的值,$2引用第二個括號中的值,以此類推。如:

^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$
# $1是兩個小寫字母組成的字符串
# $2是由小寫字母和0到9的數字組成的5個字符的字符串
# $3將是個文件名
# $4是png、jpg、gif中的其中一個。

nginx URL重寫規則配置詳解

第二部分–URL

請求被改寫。該URI可能包含正則表達式中的捕獲的位置參數或這個級別下的nginx任何配置變量。如:

 /data?file=$3.$4

如果這個URI不匹配nginx配置的任何location,那麼將給客戶端返回301(永久重定向)或302(臨時重定向)的狀態碼來表示重定向類型。該狀態碼可以通過第三個參數來明確指定。

第三部分–標記

flag標記說明:

last  #本條規則匹配完成後,繼續向下匹配新的location URI規則
break  #本條規則匹配完成即終止,不再匹配後面的任何規則
redirect  #返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址
permanent  #返回301永久重定向,瀏覽器地址欄會顯示跳轉後的URL地址

第三部分也就是尾部的標記(flag)。 last標記將導致重寫後的URI搜索匹配nginx的其他location,最多可循環10次。如:

rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4 last;

實例1

nginx配置文件:

http {
#定義image日誌格式
log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
#開啓重寫日誌
rewrite_log on;
server {
    root html;
    location / {
        # 重寫規則信息
        error_log logs/rewrite.log notice;  
        #注意這裏要用‘’單引號引起來,避免{}
        rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;
        #注意不能在上面這條規則後面加上“last”參數,否則下面的set指令不會執行
        set $image_file $3;
        set $image_type $4;
    }
    location /data {
        # 指定針對圖片的日誌格式,來分析圖片類型和大小
        access_log logs/images.log imageslog;
        root /data/images;
        #應用前面定義的變量。判斷首先文件在不在,不在再判斷目錄在不在,如果還不在就跳轉到最後一個url裏
        try_files /$arg_file /image404.html;
    }
    location = /image404.html {
        # 圖片不存在返回特定的信息
        return 404 "image not found\n";
    }
}

圖片位置:
nginx URL重寫規則配置詳解

瀏覽器訪問(測試機IP爲192.168.10.10):
nginx URL重寫規則配置詳解

訪問一個不存在的圖片時:
nginx URL重寫規則配置詳解

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