nginx if 指令的具體使用
nginx if 指令
參考這里
Syntax: if (condition) { ... } Default: — Context: server, location
if指令的格式如下:
if (condition
) { ... }
condition可以是如下類型:
- 變量名,如果變量的值是空字符串或者0表示false
- 變量使用“=”和“!=”來跟字符串比較
- 可以是正則表達式
- 檢查文件是否存在使用“-f” 和 “!-f”
- 檢查目錄是否存在使用 “-d” 和 “!-d”
- 檢查文件、目錄、符號鏈接是否存在使用 “-e” 和 “!-e”
- 檢查是否是可執(zhí)行文件使用“-x” 和 “!-x”
if指令不支持多條件、不支持嵌套、不支持else,與常見的條件表達式不同的特點是,if指令使用單個等號=而不是雙等號==表達等值比較。
直接判斷變量
- 如果變量值是空字符串或者"0"時,判定為false;否則,判定為true。
- 1.0.1版本前,任何以"0"開頭的字符串,判定為false。
if ($slow) { limit_rate 10k; } if ($invalid_referer) { return 403; }
判斷是否等于字符串
使用 “=” 和 “!=” 操作符判斷是否等于字符串
if ($request_method = POST) { return 405; }
判斷變量是否匹配正則表達式
使用 “~” 和 “!~” 操作符判斷變量是否匹配正則表達式。
- ~:判斷時區(qū)分字符大小寫
- ~*:判斷時不區(qū)分字符大小寫
- !~:判斷時區(qū)分字符大小寫
- !~*:判斷時不區(qū)分字符大小寫
if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; }
文件及目錄判斷
- “-f”, “!-f”:判斷指定的路徑是否為存在且為文件;
- “-d”, “!-d”:判斷指定的路徑是否為存在且為目錄;
- “-e”, “!-e”:判斷指定的路徑是否存在,文件或目錄均可;
- “-x”, “!-x”:判斷指定路徑的文件是否存在且可執(zhí)行;
示例1:判斷index.html是否存在
location =/index.html { if (!-f "$document_root/index.html") { rewrite ^(.*)$ /index2.html; } }
示例2:判斷URL中是否存在某個參數(shù)Parameter
if ($query_string ~* ".*(?:^|\?|&)method=autoGenerateIndex(?:(?:&.*)|$)") { ... }
示例3:判斷URI中是否為某個特定路徑
if ($request_uri ~* "^/app/stat/"){ ... }
示例4:開放白名單內(nèi)的功能,其余功能禁止訪問
# 白名單開關(guān)。false,打開;true,關(guān)閉。 set $isInWhiteList 'false'; # 白名單1:統(tǒng)計 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:if if ($request_uri ~* "abc"){ set $flag '${flag}1'; } # 條件1:else if ($request_uri !~* "abc"){ set $flag '${flag}2'; } # 條件2:if if ($query_string ~* ".*(?:^|\?|&)method=autoGenerateIndex(?:(?:&.*)|$)") { set $flag '${flag}1'; } # 條件2:else if ($query_string !~* ".*(?:^|\?|&)method=autoGenerateIndex(?:(?:&.*)|$)") { set $flag '${flag}2'; } # 多重if完了,根據(jù)結(jié)果做相應(yīng)處理 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
到此這篇關(guān)于nginx if 指令的具體使用的文章就介紹到這了,更多相關(guān)nginx if 指令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx中報錯:Permission denied與Connection refused的解決
這篇文章主要給大家介紹了在Nginx中報錯:13: Permission denied與111: Connection refused的解決方法,文中介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-04-04基于Nginx實現(xiàn)限制某IP短時間訪問次數(shù)
這篇文章主要介紹了基于Nginx實現(xiàn)限制某IP短時間訪問次數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-12-12騰訊云CentOS 6.6快速安裝 Nginx服務(wù)器圖文教程
本文通過圖文并茂的形式給大家介紹了騰訊云CentOS 6.6快速安裝 Nginx服務(wù)器的方法,介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起看看吧2016-09-09nginx代理多次302的解決方法(nginx Follow 302)
這篇文章主要介紹了nginx代理多次302的解決方法(nginx Follow 302),詳細的介紹了解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12