Nginx的Rewrite規則學習

1.什麼是Nginx的Rewrite規則?
Rewrite 主要的功能就是實現URL的重寫,Nginx的Rewrite規則採用PCRE(Perl

Compatible Regular Expressions)Perl兼容正則表達式的語法進行規則匹配,若是

您須要Nginx的Rewrite功能,在編譯Nginx以前,需要編譯安裝PCRE庫.
經過Rewrite規則,能夠實現規範的URL,根據變量來作URL轉向及選擇配置.
(1)一些使用MVC框架的程序只有一個入口,能夠經過Rewrite來實現.
(2)一些動態URL地址需要假裝成靜態HTML,便於搜索引擎抓取,也須要Rewrite來處理
(3)一些因爲目錄結構,域名變化的舊URL,需要跳轉到新的URL上,能夠經過Rewrite來

處理.

2.Nginx Rewrite規則相關指令
if , rewrite , set , return , break
(1)break,完成當前的規則集,再也不處理rewrite指令.
(2)if   語法: if(condition){...}
用於檢查一個條件是否符合,若是條件符合,則執行大括號內的語句.if指令不支持嵌

套,不支持多個條件&&和||處理.
如下信息能夠被指定爲條件:
1)變量名,其中錯誤的值包括:空字符串"",或者任何以0開始的字符串.
2)變量比較可使用=和!=運算符
3)"~"符號表示區分大小寫字母的匹配.
4)"~*"符號表示不區分大小寫字母的匹配.如firefox和FireFox是匹配的.
5)"!~"和"!~*"符號的做用恰好和"~","!~"相反,表示不匹配.
6)"-f"和"!-f"用來判斷文件是否存在.
7)"-d"和"!-d"用來判斷目錄是否存在.
8)"-e"和"!-e"用來判斷文件或目錄是否存在.
9)"-x"和"!-x"用來判斷文件是否可執行.
(3)return 語法:return code
該指令用於結束規則的執行並返回狀態碼給客戶端.狀態碼可使用這些

值:204,400,402-406,408,410,413,416,及500-504.非標準狀態碼,444將以不發送

任何Header頭的方式結束鏈接.
403Forbidden.服務器已經理解請求,可是拒絕執行它.
404Not Found.請求失敗,請求所但願獲得的資源未在服務器上發現.404這個狀態碼

被普遍應用於當服務器不想揭示爲什麼請求被拒絕,或者沒有其餘適合的響應可用的情

況下.
500Internal Server Error.服務器遇到一個不曾預料的情況,致使它沒法完成對請

求的處理.通常來講,這個問題都會在服務器的程序碼出錯時出現.
502Bad Gateway.做爲網關或代理工做的服務器嘗試執行請求時,從上游服務器接收

到無效的響應.
503Service Unavailable.因爲臨時的服務器維護或過載,服務器當前沒法處理請求.

這個情況是臨時的,而且將在一段時間之後恢復.503狀態碼的存在並不意味着服務器

在過載的時候必須使用它.某些服務器只不過是但願拒絕客戶端的鏈接.
504 Gateway Timeout做爲網關或代理工做的服務器嘗試執行請求時,未能及時從上

遊服務器(URI標識出的服務器,例如HTTP,FTP,LDAP)或輔助服務器(例如DNS)收到響

應.
(4)rewrite指令.語法:rewrite regex replacement flag .該指令根據表達式來重

定向URI,或者修改字符串.指令根據配置文件中的順序來執行.注意重寫表達式只對

相對路徑有效.若是想配對主機名,應該使用If語句.
rewrite指令的最後一項參數爲flag標記,支持的flag標記有:
last——至關於Apache裏的[L]標記,表示完成rewrite.
break——本條規則匹配完成後,終止匹配,再也不匹配後面的規則.
redirect——返回302臨時重定向,瀏覽器地址欄會顯示跳轉後的URL地址.
permanent——返回301永久重定向,瀏覽器地址欄會顯示跳轉後的URL地址.
在以上標記中,last和break用來實現URI重寫,瀏覽器地址欄的URL地址不變,但在服

務器端訪問的路徑發生了變化.redirect和permanent用來實現URL跳轉,瀏覽器地址

欄會顯示跳轉後的URL地址.
1)通常在根location中(即location/{...})或直接在server標籤中編寫rewrite規則

.推薦使用last標記,在非根location中(location/cms/{...}),則使用break標記.
如:
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last ;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last ;
return 403 ;

location /download/{
   rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break ;
   rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break ;
   return 403 ;
}
2)若是被替換的URI中含有參數(即相似/app/test.php?id=5之類的URI),默認狀況

下參數會被自動附加到替換串上,你能夠經過在替換串的末尾加上?標記來解決這一

問題.不加?標記和加上?標記的URL跳轉區別:

rewrite ^/test(.*)$ http://www.yourdomain.com/home permanent ;
訪問http://www.yourdomain.com/test?id=5 通過301跳轉後的URL地址爲

http://www.yourdomain.com/home?id=5

rewrite ^/test(.*)$ http://www.yourdomain.com/home? permanent ;
訪問http://www.yourdomain.com/test?id=5 通過301跳轉後的URL地址爲

http://www.yourdomain.com/home

(5)set指令.語法: set variable value .該指令用於定義一個變量,並給變量賦值.

變量的值能夠爲文本,變量及文本變量的聯合.例如: set $varname 'hello' ;u

(6)uninitialized_variable_warn 指令. 語法uninitialized_variable_warn on|

off 該指令用於開啓或關閉記錄關於未初始化變量的警告信息,默認值爲開啓.

(7)Nginx Rewrite能夠用到的全局變量.
在if , location , rewrite 指令中,可使用如下局部變量.
$args , $content_length , $content_type ,$document_root , $document_uri,

$host , $http_user_agent , $http_cookie , $limit_rate ,

$request_body_file , $request_method , $remote_addr , $remote_port ,

$remote_user , $remote_filename , $request_uri , $query_string , $scheme

,$server_protocol , $server_addr , $server_name , $server_port , $uri

 
3.PCRE正則表達式語法.
1)\ 將下一個字符標記爲一個特殊字符,或一個原義字符,或一個向後引用,或一個八

進制轉義符."\n"匹配換行符,"\\"匹配"\",而"\("匹配"(" .
2)^ 匹配輸入字符串的開始位置.若是設置了RegExp對象的Multiline屬性,^也匹

配"\n"或"\r"以後的位置.
3)$ 匹配輸入字符串的結束位置,若是設置了RegExp對象的Multiline屬性,$也匹

配"\n"或"\r"以前的位置.
4)*匹配前面的子表達式零次或屢次.等價於{0,}例,zo*能匹配"z"及"zoo".
5)+匹配前面的子表達式一次或屢次,等價於{1,}例,zo+能匹配"zo"及"zoo"但不能匹

配"z".
6)?匹配前面的字表達式零次或一次,例如,「do(es)?"能夠匹配"do"或"does"中

的"do".?等價於{0,1}。
相關文章
相關標籤/搜索