nginx location if 的匹配規則
nginx location if 的匹配規則
cuizhiliang關注0人評論 23197人閱讀 2016-11-20 16:13:32cation匹配命令
~ #波浪線表示執行一個正則匹配,區分大小寫
~* #表示執行一個正則匹配,不區分大小寫
^~ #^~表示普通字元匹配,不是正則匹配。如果該選項匹配,只匹配該選項,不匹配別的選項,一般用來匹配目錄
= #進行普通字元精確匹配
@ #"@" 定義一個命名的 location,使用在內部定向時,例如 error_page, try_files
參考:https://segmentfault.com/a/1190000002797606
location 優先順序官方文件
1. Directives with the = prefix that match the query exactly. If found, searching stops.
2. All remaining directives with conventional strings, longest match first. If this match used the ^~ prefix, searching stops.
3. Regular expressions, in order of definition in the configuration file.
4. If #3 yielded a match, that result is used. Else the match from #2 is used.
1. =字首的指令嚴格匹配這個查詢。如果找到,停止搜尋。
2. 所有剩下的常規字串,最長的匹配。如果這個匹配使用^字首,搜尋停止。
3. 正則表示式,在配置檔案中定義的順序。
4. 如果第3條規則產生匹配的話,結果被使用。否則,如同從第2條規則被使用。
順序 no優先順序: (location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)
例如:
location = / { # 只匹配"/". [ configuration A ] } location / { # 匹配任何請求,因為所有請求都是以"/"開始 # 但是更長字元匹配或者正則表示式匹配會優先匹配 [ configuration B ] } location ^~ /images/ { # 匹配任何以 /images/ 開始的請求,並停止匹配 其它location [ configuration C ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配以 gif, jpg, or jpeg結尾的請求. # 但是所有 /images/ 目錄的請求將由 [Configuration C]處理. [ configuration D ] }
我的疑問1 : 如果是以下的
-
/images/1.gif -> 會匹配C還是D呢? 會按順序匹配到C。因為都是正則所以按順序匹配到了C
location ~ /images/ { # 匹配任何以 /images/ 開始的請求,並停止匹配 其它location [ configuration C ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配以 gif, jpg, or jpeg結尾的請求. # 但是所有 /images/ 目錄的請求將由 [Configuration C]處理. [ configuration D ] }
我的疑問2: 如果是以下的。會匹配到D ,因為正則匹配到優先順序大於部分起始路徑。
location /images/ { # 匹配任何以 /images/ 開始的請求,並停止匹配 其它location [ configuration C ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配以 gif, jpg, or jpeg結尾的請求. # 但是所有 /images/ 目錄的請求將由 [Configuration C]處理. [ configuration D ] }
if 條件判斷:
參考:
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_rewrite_module.html#if
語法: | if ( |
預設值: | — |
上下文: | server , location |
計算指定的condition
的值。如果為真,執行定義在大括號中的rewrite模組指令,並將if
指令中的配置指定給請求。if
指令會從上一層配置中繼承配置。
條件可以是下列任意一種:
-
變數名;如果變數值為空或者是以“
0
”開始的字串,則條件為假; -
使用“
=
”和“!=
”運算子比較變數和字串; -
使用“
~
”(大小寫敏感)和“~*
”(大小寫不敏感)運算子匹配變數和正則表示式。正則表示式可以包含匹配組,匹配結果後續可以使用變數$1
..$9
引用。如果正則表示式中包含字元“}
”或者“;
”,整個表示式應該被包含在單引號或雙引號的引用中。 -
使用“
-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; }
案例每個使用者的guid存在cookie中要存入nginx日誌 如果存在的話:
set $guid "-";
if ( $http_cookie ~* "guid=(\S+)(;.*|$)"){
set $guid $1;
}
內嵌變數$invalid_referer
的值是通過valid_referers指令設定的。
補充正則表示式知識:
參考:https://regex101.com/
(?:;|$)
(;|$)
兩者的區別即 ?:的作用。加上?:在分組中表示不捕捉這個分組,在後面不可以引用 Non-capturing group
(?:;|$)
Capturing Group
(;|$)
rewrite 模組
重寫語法:
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_rewrite_module.html#if
語法: | rewrite |
預設值: | — |
上下文: | server , location , if |
如果指定的正則表示式能匹配URI,此URI將被replacement
引數定義的字串改寫。rewrite
指令按其在配置檔案中出現的順序執行。flag可以終止後續指令的執行。如果replacement的字串以“http://
”或“https://
”開頭,nginx將結束執行過程,並返回給客戶端一個重定向。
可選的flag
引數可以是其中之一:
-
last
-
停止執行當前這一輪的
ngx_http_rewrite_module
指令集,然後查詢匹配改變後URI的新location; -
break
-
停止執行當前這一輪的
ngx_http_rewrite_module
指令集; -
redirect
-
在replacement字串未以“
http://
”或“https://
”開頭時,使用返回狀態碼為302的臨時重定向; -
permanent
-
返回狀態碼為301的永久重定向。
如果URI中含有引數(/app/test.php?id=5),預設情況下引數會被自動附加到替換串上,可以通過在替換串的末尾加上?標記來解決這一問題。
例如:
複製程式碼程式碼示例:
rewrite ^/test(.*)$ http://www.it.net.cn/home permanent;
訪問http://www.it.net.cn/test?id=5 會跳轉到 http://www.it.net.cn/home?id=5
例如:如果將類似URL /photo/123456 重定向到 /path/to/photo/12/1234/123456.png
複製程式碼程式碼示例:
Rewrite "/photo/([0-9]{2})([0-9]{2})([0-9]{2})" /path/to/photo/$1/$1$2/$1$2$3.png ;
set指令。這裡的變數名和php的語法差不多。變數名前面定義$代表定義變數(set)或者引用變數。
Syntax: | set |
---|---|
Default: | — |
Context: | server , location , if |
Sets a value
for the specified variable
. The value
can contain text, variables, and their combination.