Ngixn運維之七 if、set、return
阿新 • • 發佈:2018-11-06
Ngixn運維之七 if、set、return
set
Syntax: set $variable value;
Default: —
Context: server, location, if
set可以為變數設定值,值可以為字串/變數以及它們的組合。
例如:
set $s1 1;
set $s2 "${s1}1"
return
Syntax: return code [text]; return code URL; return URL;
Default: —
Context: server, location, if
停止處理並且返回響應碼給客戶端,非標準程式碼444會在不傳送響應頭的情況下關閉連線。
從 0.8.42版本開始, 支援為狀態碼(for codes 301, 302, 303, 307, and 308)跳轉URL為其他的狀態碼返回返回體資料。返回體或者跳轉的URL支援包含變數。特殊情況,重定向URL可以指定為該伺服器的本地URI,在這種情況下,完整的跳轉URL依據請求 scheme ($scheme) 和the server_name_in_redirect and port_in_redirect 指令。
例如:
請求重定向到一個新域名
location = /test {
return 301 $scheme://www.example.com$request_uri;
}
請求直接返回資料
location ^~ /getIP {
default_type text/html;
return 200 '[$remote_addr]';
}
if
Syntax: if (condition) { … }
Default: —
Context: server, location
對特定的條件進行判斷,如果為true,括號內將會被執行。
正則表示式匹配:
- =:等值比較;
- ~:區分大小寫的正則表示式模式匹配
- ~*:不區分大小寫的正則表示式模式匹配
- !~:區分大小寫的正則表示式模式不匹配
- !~*:不區分大小寫的正則表示式模式不匹配
檔案及目錄匹配判斷:
- -f, !-f:判斷指定的路徑是否為存在且為檔案;
- -d, !-d:判斷指定的路徑是否為存在且為目錄;
- -e, !-e:判斷指定的路徑是否存在,檔案或目錄均可;
- -x, !-x:判斷指定路徑的檔案是否存在且可執行;
例如:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
if ($request_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
AND,OR多重判斷
nginx的配置中不支援if條件的&& ||運算 ,並且不支援if的巢狀語法,但是我們可以用變數的方式來實現:
具體方法為AND 就用變數疊加,OR就用0或1切換。
例如我們的目標(虛擬碼):
if ($remote_addr ~ "^(12.34|56.78)" && $http_user_agent ~* "spider") {
return 403;
}
我們可以這麼做
set $flag 0;
if ($remote_addr ~ "^(12.34|56.78)") {
set $flag "${flag}1";
}
if ($http_user_agent ~* "spider") {
set $flag "${flag}2";
}
if ($flag = "012") {
return 403;
}