rewrite模塊介紹html
nginx的重寫模塊是一個簡單的正則表達式匹配與一個虛擬堆疊機結合。依賴於PCRE庫,所以須要安裝pcre。根據相關變量重定向和選擇不一樣的配置,從一個location跳轉到另外一個location,不過這樣的循環最多能夠執行10次,超事後nginx將返回500錯誤。同時,重寫模塊包含set指令,來建立新的變量並設其值,這在有些情景下很是有用的,如記錄條件標識、傳遞參數到其餘location、記錄作了什麼等等。linux
rewrite模塊指令nginx
break正則表達式
語法:break 默認值:none 使用字段:server, location, if
做用:完成當前設置的重寫規則,中止執行其餘的重寫規則。url
if日誌
語法:if (condition) { … } 默認值:none 使用字段:server, location
注意:儘可能考慮使用trp_files代替。code
判斷的條件能夠有如下值:orm
一個變量的名稱:空字符傳」「或者一些「0」開始的字符串爲false。 字符串比較:使用=或!=運算符 正則表達式匹配:使用~(區分大小寫)和~(不區分大小寫),取反運算!~ 和!~。 文件是否存在:使用-f和!-f操做符 目錄是否存在:使用-d和!-d操做符 文件、目錄、符號連接是否存在:使用-e和!-e操做符 文件是否可執行:使用-x和!-x操做符
returnserver
語法:return code 默認值:none 使用字段:server, location, if
中止處理併爲客戶端返回狀態碼。非標準的444狀態碼將關閉鏈接,不發送任何響應頭。可使用的狀態碼有:204,400,402-406,408,410, 411, 413, 416與500-504。若是狀態碼附帶文字段落,該文本將被放置在響應主體。相反,若是狀態碼後面是一個URL,該URL將成爲location頭補值。沒有狀態碼的URL將被視爲一個302狀態碼。htm
rewrite
語法:rewrite regex replacement flag 默認值: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中的其中一個。
第二部分–URI
請求被改寫。該URI可能包含正則表達式中的捕獲的位置參數或這個級別下的nginx任何配置變量。如:
/data?file=$3.$4
若是這個URI不匹配nginx配置的任何location,那麼將給客戶端返回301(永久重定向)或302(臨時重定向)的狀態碼來表示重定向類型。該狀態碼能夠經過第三個參數來明確指定。
第三部分–標記
第三部分也就是尾部的標記(flag)。 last標記將致使重寫後的URI搜索匹配nginx的其餘location,最多可循環10次。如:
rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4 last;
break指令能夠當作自身指令。如:
if ($bwhog) { limit_rate 300k; break; }
實例
http { #定義image日誌格式 log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status; # 開啓重寫日誌 rewrite_log on; server { root /home/www; 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 mian; root /data/images; # 應用前面定義的變量。判斷首先文件在不在,不在再判斷目錄在不在,若是還不在就跳轉到最後一個url裏 try_files /$arg_file /image404.html; } location = /image404.html { # 圖片不存在返回特定的信息 return 404 "image not found\n"; } }