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 ...;
1
這里表示請求頭部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