Rewrite主要的功能就是實(shí)現(xiàn)URL的重寫,Nginx的Rewrite規(guī)則采用PCRE(Perl
Compatible Regular Expressions)Perl兼容正則表達(dá)式的語法進(jìn)行規(guī)則匹配,如果
您需要Nginx的Rewrite功能,在編譯Nginx之前,須要編譯安裝PCRE庫.
通過Rewrite規(guī)則,可以實(shí)現(xiàn)規(guī)范的URL,根據(jù)變量來做URL轉(zhuǎn)向及選擇配置.
(1)一些使用MVC框架的程序只有一個(gè)入口,可以通過Rewrite來實(shí)現(xiàn).
(2)一些動(dòng)態(tài)URL地址須要偽裝成靜態(tài)HTML,便于搜索引擎抓取,也需要Rewrite來處理
(3)一些由于目錄結(jié)構(gòu),域名變化的舊URL,須要跳轉(zhuǎn)到新的URL上,可以通過Rewrite來
處理.
2.Nginx Rewrite規(guī)則相關(guān)指令
if , rewrite , set , return , break
(1)break,完成當(dāng)前的規(guī)則集,不再處理rewrite指令.
(2)if 語法: if(condition){...}
用于檢查一個(gè)條件是否符合,如果條件符合,則執(zhí)行大括號(hào)內(nèi)的語句.if指令不支持嵌
套,不支持多個(gè)條件&&和||處理.
以下信息可以被指定為條件:
1)變量名,其中錯(cuò)誤的值包括:空字符串"",或者任何以0開始的字符串.
2)變量比較可以使用=和!=運(yùn)算符
3)"~"符號(hào)表示區(qū)分大小寫字母的匹配.
4)"~*"符號(hào)表示不區(qū)分大小寫字母的匹配.如firefox和FireFox是匹配的.
5)"!~"和"!~*"符號(hào)的作用剛好和"~","!~"相反,表示不匹配.
6)"-f"和"!-f"用來判斷文件是否存在.
7)"-d"和"!-d"用來判斷目錄是否存在.
8)"-e"和"!-e"用來判斷文件或目錄是否存在.
9)"-x"和"!-x"用來判斷文件是否可執(zhí)行.
(3)return 語法:return code
該指令用于結(jié)束規(guī)則的執(zhí)行并返回狀態(tài)碼給客戶端.狀態(tài)碼可以使用這些
值:204,400,402-406,408,410,413,416,及500-504.非標(biāo)準(zhǔn)狀態(tài)碼,444將以不發(fā)送
任何Header頭的方式結(jié)束連接.
403Forbidden.服務(wù)器已經(jīng)理解請(qǐng)求,但是拒絕執(zhí)行它.
404Not Found.請(qǐng)求失敗,請(qǐng)求所希望得到的資源未在服務(wù)器上發(fā)現(xiàn).404這個(gè)狀態(tài)碼
被廣泛應(yīng)用于當(dāng)服務(wù)器不想揭示為何請(qǐng)求被拒絕,或者沒有其他適合的響應(yīng)可用的情
況下.
500Internal Server Error.服務(wù)器遇到一個(gè)未曾預(yù)料的狀況,導(dǎo)致它無法完成對(duì)請(qǐng)
求的處理.一般來說,這個(gè)問題都會(huì)在服務(wù)器的程序碼出錯(cuò)時(shí)出現(xiàn).
502Bad Gateway.作為網(wǎng)關(guān)或代理工作的服務(wù)器嘗試執(zhí)行請(qǐng)求時(shí),從上游服務(wù)器接收
到無效的響應(yīng).
503Service Unavailable.由于臨時(shí)的服務(wù)器維護(hù)或過載,服務(wù)器當(dāng)前無法處理請(qǐng)求.
這個(gè)狀況是臨時(shí)的,并且將在一段時(shí)間以后恢復(fù).503狀態(tài)碼的存在并不意味著服務(wù)器
在過載的時(shí)候必須使用它.某些服務(wù)器只不過是希望拒絕客戶端的連接.
504 Gateway Timeout作為網(wǎng)關(guān)或代理工作的服務(wù)器嘗試執(zhí)行請(qǐng)求時(shí),未能及時(shí)從上
游服務(wù)器(URI標(biāo)識(shí)出的服務(wù)器,例如HTTP,FTP,LDAP)或輔助服務(wù)器(例如DNS)收到響
應(yīng).
(4)rewrite指令.語法:rewrite regex replacement flag .該指令根據(jù)表達(dá)式來重
定向URI,或者修改字符串.指令根據(jù)配置文件中的順序來執(zhí)行.注意重寫表達(dá)式只對(duì)
相對(duì)路徑有效.如果想配對(duì)主機(jī)名,應(yīng)該使用If語句.
rewrite指令的最后一項(xiàng)參數(shù)為flag標(biāo)記,支持的flag標(biāo)記有:
last——相當(dāng)于Apache里的[L]標(biāo)記,表示完成rewrite.
break——本條規(guī)則匹配完成后,終止匹配,不再匹配后面的規(guī)則.
redirect——返回302臨時(shí)重定向,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的URL地址.
permanent——返回301永久重定向,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的URL地址.
在以上標(biāo)記中,last和break用來實(shí)現(xiàn)URI重寫,瀏覽器地址欄的URL地址不變,但在服

務(wù)器端訪問的路徑發(fā)生了變化.redirect和permanent用來實(shí)現(xiàn)URL跳轉(zhuǎn),瀏覽器地址
欄會(huì)顯示跳轉(zhuǎn)后的URL地址.
1)一般在根location中(即location/{...})或直接在server標(biāo)簽中編寫rewrite規(guī)則
.推薦使用last標(biāo)記,在非根location中(location/cms/{...}),則使用break標(biāo)記.
如:
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中含有參數(shù)(即類似/app/test.php?id=5之類的URI),默認(rèn)情況
下參數(shù)會(huì)被自動(dòng)附加到替換串上,你可以通過在替換串的末尾加上?標(biāo)記來解決這一
問題.不加?標(biāo)記和加上?標(biāo)記的URL跳轉(zhuǎn)區(qū)別:
rewrite ^/test(.*)$ http://www.yourdomain.com/home permanent;
訪問http://www.yourdomain.com/test?id=5 經(jīng)過301跳轉(zhuǎn)后的URL地址為
http://www.yourdomain.com/home?id=5
rewrite ^/test(.*)$ http://www.yourdomain.com/home? permanent;
訪問http://www.yourdomain.com/test?id=5 經(jīng)過301跳轉(zhuǎn)后的URL地址為
http://www.yourdomain.com/home
(5)set指令.語法: set variable value .該指令用于定義一個(gè)變量,并給變量賦值.
變量的值可以為文本,變量及文本變量的聯(lián)合.例如: set $varname 'hello' ;u
(6)uninitialized_variable_warn 指令. 語法uninitialized_variable_warnon|
off 該指令用于開啟或關(guān)閉記錄關(guān)于未初始化變量的警告信息,默認(rèn)值為開啟.
(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正則表達(dá)式語法.
1) 將下一個(gè)字符標(biāo)記為一個(gè)特殊字符,或一個(gè)原義字符,或一個(gè)向后引用,或一個(gè)八
進(jìn)制轉(zhuǎn)義符."n"匹配換行符,"\"匹配"",而"("匹配"(" .
2)^ 匹配輸入字符串的開始位置.如果設(shè)置了RegExp對(duì)象的Multiline屬性,^也匹
配"n"或"r"之后的位置.
3)$ 匹配輸入字符串的結(jié)束位置,如果設(shè)置了RegExp對(duì)象的Multiline屬性,$也匹
配"n"或"r"之前的位置.
4)*匹配前面的子表達(dá)式零次或多次.等價(jià)于{0,}例,zo*能匹配"z"及"zoo".
5)+匹配前面的子表達(dá)式一次或多次,等價(jià)于{1,}例,zo+能匹配"zo"及"zoo"但不能匹
配"z".
6)?匹配前面的字表達(dá)式零次或一次,例如,“do(es)?"可以匹配"do"或"does"中
的"do".?等價(jià)于{0,1}。
愛華網(wǎng)



