目錄
- nginx if 指令
- 直接判斷變量
- 判斷是否等于字符串
- 判斷變量是否匹配正則表達式
- 文件及目錄判斷
- 示例1:判斷index.html是否存在
- 示例2:判斷URL中是否存在某個參數Parameter
- 示例3:判斷URI中是否為某個特定路徑
- 示例4:開放白名單內的功能,其余功能禁止訪問
- 示例5:if-else
- 示例6:多重if判斷
- 參考
nginx if 指令
參考這里
Syntax: if (condition) { ... }
Default: —
Context: server, location
直接判斷變量
- 如果變量值是空字符串或者"0"時,判定為false;否則,判定為true。
- 1.0.1版本前,任何以"0"開頭的字符串,判定為false。
if ($slow) {limit_rate 10k;
}if ($invalid_referer) {return 403;
}
判斷是否等于字符串
使用 “=” 和 “!=” 操作符判斷是否等于字符串
if ($request_method = POST) {return 405;
}
判斷變量是否匹配正則表達式
使用 “~” 和 “!~” 操作符判斷變量是否匹配正則表達式。
- ~:判斷時區分字符大小寫
- ~*:判斷時不區分字符大小寫
- !~:判斷時區分字符大小寫
- !~*:判斷時不區分字符大小寫
if ($http_user_agent ~ MSIE) {rewrite ^(.*)$ /msie/$1 break;
}if ($http_cookie ~* "id=([^;]+)(?:;|$)") {set $id $1;
}
文件及目錄判斷
- “-f”, “!-f”:判斷指定的路徑是否為存在且為文件;
- “-d”, “!-d”:判斷指定的路徑是否為存在且為目錄;
- “-e”, “!-e”:判斷指定的路徑是否存在,文件或目錄均可;
- “-x”, “!-x”:判斷指定路徑的文件是否存在且可執行;
示例1:判斷index.html是否存在
location =/index.html {if (!-f "$document_root/index.html") {rewrite ^(.*)$ /index2.html;}
}
示例2:判斷URL中是否存在某個參數Parameter
if ($query_string ~* ".*(?:^|\?|&)method=autoGenerateIndex(?:(?:&.*)|$)") { ...
}
示例3:判斷URI中是否為某個特定路徑
if ($request_uri ~* "^/app/stat/"){...
}
示例4:開放白名單內的功能,其余功能禁止訪問
# 白名單開關。false,打開;true,關閉。
set $isInWhiteList 'false';
# 白名單1:統計
if ($request_uri ~* "^/app/stat/"){set $isInWhiteList 'true';
}
# 白名單2:ajax接口
if ($request_uri ~* "^/app/ajax/"){set $isInWhiteList 'true';
}
# 采用白名單方式放行功能
location /app {if ($isInWhiteList != 'true') {rewrite ^/ /deny;}proxy_pass http://127.0.0.1:8080;
}# 禁止訪問
location =/deny {deny all;
}
示例5:if-else
# 條件:if
if ($request_uri ~* "abc"){set $flag '${flag}1';
}
# 條件:else
if ($request_uri !~* "abc"){set $flag '${flag}2';
}
示例6:多重if判斷
server {...set $flag "";# 條件1:ifif ($request_uri ~* "abc"){set $flag '${flag}1';}# 條件1:elseif ($request_uri !~* "abc"){set $flag '${flag}2';}# 條件2:ifif ($query_string ~* ".*(?:^|\?|&)method=autoGenerateIndex(?:(?:&.*)|$)") { set $flag '${flag}1';}# 條件2:elseif ($query_string !~* ".*(?:^|\?|&)method=autoGenerateIndex(?:(?:&.*)|$)") { set $flag '${flag}2';}# 多重if完了,根據結果做相應處理if ($flag = '11') {...}if ($flag = '12') {...}if ($flag = '21') {...}if ($flag = '22') {...}location / {...}
}
參考
https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if
Nginx的多重if判斷