Nginx之八 URL重寫(rewrite)配置
Nginx URL重寫(rewrite)配置及資訊詳解
1)if判斷指令
語法為if(condition){…} #對給定的條件condition進行判斷。
如果為真,大括號內的rewrite指令將被執行,if條件(conditon)可以是如下任何內容:
a:當表示式只是一個變數時,如果值為空或任何以0開頭的字串都會當做false,其他情況為true。
b: 直接比較變數和內容時,使用 = 或!=
c: 正則表示式匹配,*不區分大小寫的匹配,!和!*反之。
注意:使用正則表示式字串一般不需要加引號,但是如果含有右花括號“}”或者分號“;”字元時,必須要給整個正則表示式加引號
其他指令:
-f和!-f用來判斷請求檔案是否存在
-d和!-d用來判斷請求目錄是否存在
-e和!-e用來判斷是請求的檔案或者目錄否存在
-x和!-x用來判斷請求的檔案是否可執行
例子:if (-f $request_filename){
… #判斷請求的檔案是否存在,存在就執行這裡面的程式碼塊
}
2)break指令
用於中斷當前相同作用域中的Nginx配置,和Java中的break語法類似,可以在server塊和location以及if塊中使用。
語法:break;
3)if 可用的全域性變數
還有$host_host變數,和$host區別如下:
$host不帶埠,$http_host帶埠
4)return指令
該指令用於完成對請求的處理,直接向客戶端響應狀態的程式碼。和Java中的return語法類似。可以再server塊和location以及if塊中使用。
語法:return code URL; #code表示狀態碼,URL表示返回給客戶單的URL地址
或者:return URL: #當狀態碼是302或者307的時候,可以使用,返回的URL必須包含“http://”、“https://”或者直接使用“$scheme”變數(RequestScheme代表傳輸協議,
Nginx內建變數)
或者 return [text]; #為返回給客戶端的響應體內容,支援變數的使用
5)rewrite指令
該指令通過正則表示式的使用來改變URI.可以同時存在一個或者多個指令,按照順序一次對URL進行匹配和處理。該指令可以在server塊後者location塊中配置
語法: 指令語法:rewrite regex replacement [flag];
rewrite是實現URL重定向的重要指令,
regex:用來匹配URI的正則表示式;
replacement:匹配成功後用來替換URI中被擷取內容的字串,預設情況如果該字串包含“http://”、"https://"開頭,則不會繼續向下對URI進行其他處理。直接返回重寫的URI給客戶端
flag:用來設定rewrite對URI的處理行為,包含如下資料:
標記符號 說明 last 終止在本location塊中處理接收到的URI,並將此處重寫的URI作為新的URI使用其他location進行處理。(只是終止當前location的處理) break 將此處重寫的URI作為一個新的URI在當前location中繼續執行,並不會將新的URI轉向其他location。 redirect 將重寫後的URI返回個客戶端,狀態碼是302,表明臨時重定向,主要用在replacement字串不以“http://”,“ https://”或“ $scheme” 開頭; permanent 將重寫的URI返回客戶端,狀態碼為301,指明是永久重定向;
6)rewrite_log指令
該指令用於是否開啟URL重寫日誌的輸出,
語法:
rewrite_log on | off
預設是off,如果配置為on,URL重寫的相關日誌將以notice級別輸出到error_log指令配置的日誌檔案中
7)set指令
用來設定新的變數,
語法: set variable value;
variable,這個是變數的名稱,這個符號的“$”必須作為變數第一個字元,並且不能和Nginx伺服器預設的全域性變數同名
value,為變數的值。
比如 set $id “3”; #設定id為3
8)uninitialized_variable_warn指令
這個指令用來配置會用未初始化的變數時,是否記錄警告日誌,
語法: unitialized_variable_warn on | off
預設設定時on狀態
9)防盜鏈的例子
語法:valid_referers none | blocked | server_name | string ...;
這裡表示請求頭部Referer域是否匹配上面值,如果匹配了$invalid_referer 的值為0,沒有相匹配就是1;
字元 說明 none 表示Referer頭域不存在的情況 blocked 檢測Referer頭域的值被防火牆或者代理伺服器刪除或者偽裝的情況,這種情況,該頭域的值不以“http://”或者“https://”開頭 server_name 設定一個或者多個URL,檢測Referer頭域的值是否是這些URL中的某個
10)例子
例子一(域名跳轉):
server {
listen 80;
server_name abc.com;
rewrite ^/(.*) http://www.ab c.com/$1 permanent; # 跳轉到www.abc.com網址上
}
例子二:
server {
listen 80;
server_name www.myweb.com www.web.info
if($host ~ myweb\.info){ #"."需要使用“\”轉義,這裡是匹配到www.web.info時
rewrite ^(.*) http://www.myweb.com/&1 permant; #永久重定向到http://www.myweb.com網址上&1是匹配的uri
}
}
例子三(防盜鏈):
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.vison.com www.wsvison.com; #這裡表示Referer頭域中的值是none或者blocked或者後面這些網址才會返回去正常的gif|jpg|png|swf|flv檔案,否則執行下面if塊程式碼
if ($invalid_referer) { #上面沒有匹配成功,$invalid_referer值為1,否則為0
return 404;
} //防盜鏈
}
其他例子:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
} //如果UA包含"MSIE",rewrite請求到/msid/目錄下
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
} //如果cookie匹配正則,設定變數$id等於正則引用部分
if ($request_method = POST) {
return 405;
} //如果提交方法為POST,則返回狀態405(Method not allowed)。return不能返回301,302
if ($slow) {
limit_rate 10k;
} //限速,$slow可以通過 set 指令設定
if (!-f $request_filename){
break;
proxy_pass http://127.0.0.1;
} //如果請求的檔名不存在,則反向代理到localhost 。這裡的break也是停止rewrite檢查
if ($args ~ post=140){
rewrite ^ http://example.com/ permanent;
} //如果query string中包含"post=140",永久重定向到example.com
參考:https://segmentfault.com/a/1190000002797606#articleHeader0