Location
參數匹配模式
參數 | 匹配方式 | 匹配模式 | 說明 | 注意事項 |
---|---|---|---|---|
= | 精準匹配 | 普通字符串匹配 | 用于標準uri 前,要求請求字符串與uri精準匹配,成功則立即處理,nginx停止搜索其他匹配。 | |
~ | 正則匹配 | 正則表達式匹配 | 用于正則uri ,表示uri包含正則表達式,并且區分大小寫。 | 如果uri包含正則表達式,就必須要使用“~”或者“~*”標識。 |
~* | 正則表達式匹配 | 用于正則uri ,表示uri包含正則表達式,并且不區分大小寫。 | ||
^~ | 帶參前綴匹配 (短路匹配) | 普通字符串匹配 | 用于標準uri 前,并要求一旦匹配到就會立即處理,不再去匹配其他的正則URI,一般用來匹配目錄。 | |
空 | 普通前綴匹配 | 普通字符串匹配 | location后沒有參數直接跟著標準uri ,表示前綴匹配,代表跟請求中的uri從頭開始匹配。 |
參數匹配模式優先級
location 的匹配并不完全按照其在配置文件中出現的順序來匹配,請求URI 會按如下規則進行匹配,優先級從高到低依次為(序號越小優先級越高
):
1. location = # 精準匹配,精準匹配成功則會立即停止其他類型匹配;
2. location ^~ # 帶參前綴匹配。如果是帶有 ^~ 的前綴匹配,匹配成功則立即停止其他類型匹配;如果是普通前綴匹配(不帶參數 ^~ )成功則會暫存,繼續查找正則匹配;
3. location ~ # 正則匹配(區分大小寫)。當同時有多個正則匹配時,按其在配置文件中出現的先后順序優先匹配,命中則立即停止其他類型匹配;
4. location ~* # 正則匹配(不區分大小寫)
5. location /a # 普通前綴匹配,優先級低于帶參數前綴匹配。所有正則匹配均未成功時,返回步驟 2 中暫存的普通前綴匹配(不帶參數 ^~ )結果。普通字符串匹配則無視順序,只會選擇最精確的匹配。
6. location / # 任何沒有匹配成功的,都會匹配這里處理
表達式 | 說明 | |
---|---|---|
^ | 匹配輸入字符串的起始位置(以什么開頭)。 | |
$ | 匹配輸入字符串的結束位置(以什么結尾)。 | |
* | 匹配前面的字符 零次或多次。 如"01*“能夠匹配到"0”、“01”、“011”、“0111…”。 | |
+ | 匹配前面的字符 一次或多次。 如"01*“能夠匹配到"01”、“011”、“0111…”。 | |
? | 匹配前面字符 零次或一次。 如01?只能能夠匹配到"0"、“01”。 | |
. | 匹配除”\n“之外的任意一個字符,若要匹配包括”\n“在內的任意字符則使用”[.\n]“之類的表達式 | .* |
|轉義符 | ||
\d | 匹配出數字效果于[0-9]一致 | |
\s | 空白符 | |
\w | 任意單詞字符包括下劃線 | |
{n} | 匹配前面表字符n次 | |
{n,} | 匹配前面字符不少于n次 | |
{n,m} | 匹配前面字符n到m次 | |
[] | 定義匹配的字符范圍 | |
[c] | 匹配單個字符c | |
[a-z] | 匹配a-z小寫字母任意一個 | |
[a-zA-Z0-9] | 匹配范圍大小寫字母及數字 | |
() | 看成整體匹配 | |
或運算符 |
直接上案例
開始之前先介紹一個配置:
merge_slashes on | off; 默認是開啟的也就是會合并// 為/ 提高匹配成功的概率,也就是容錯
通用匹配
一般是兜底策略(待完善)
#如果兜底策略是 靜態文件 這樣是不行了 比如請求一個路徑 /jj 會404 (why?)
location / {root html;index index.html index.htm;
}
# 如果是這樣配置 則所有沒有匹配上的路徑最終都會返回402
location / {return 402;
}
普通前綴匹配和通用匹配
1 在普通匹配里一定要注意這兩個路徑是不同的,如果是下面這樣的配置:
http://127.0.0.1:8887/doc/aaa/ 可以匹配成功
http://127.0.0.1:8887/doc/aaa 會404
http://127.0.0.1:8887/Doc/aaa 也會匹配成功
location /doc/aaa/ {return 401;
}
2 普通匹配遵循最長策略
location /document {return 401;}location /doc {return 402;}
訪問document docm docume 都會返回401
帶參匹配
server {listen 80;server_name localhost;location ^~ /doc {return 401;}location ~* ^/document$ {return 402;}
}
如果沒有其它的帶參匹配,則帶參匹配匹配成功后立即返回。如果還有其他帶參匹配,則也是遵循最長匹配原則。
精準匹配
server {listen 80;server_name localhost;location = / {return 400;}location = /document {return 401;}}
同理也是如果只有一個精準匹配則會立即返回,否則也是遵循最長原則。
優先級
location ~ /Test1/$ {add_header Content-Type "text/plain";return 200 'first regular expressions match!';
}
location ~* /Test1/(\w+)$ {add_header Content-Type "text/plain";return 200 'longest regular expressions match!';
}
location ^~ /Test1/ {add_header Content-Type "text/plain";return 200 'stop regular expressions match!';
}
location /Test1/Test2 {add_header Content-Type "text/plain";return 200 'longest prefix string match!';
}
location /Test1 {add_header Content-Type "text/plain";return 200 'prefix string match!';
}
location = /Test1 {add_header Content-Type "text/plain";return 200 'exact match!';
}
測試1:
訪問: /Test1 返回值 ‘exact match!’ 因為精確匹配的優先級最高,匹配到了以后不會再向后匹配。
測試2:
訪問: /Test1/ 這個時候精準匹配不上了所以按照優先級應該是去找正則匹配,由于我們配置了帶參匹配^~ 這個匹配成功也會立即返回。結果為:‘stop regular expressions match!’
測試3:
訪問:/Test1/Test2 ~* /Test1/(\w+)$ 由于我們配置正則表達式優先級更高,所以返回結果:‘longest regular expressions match!’
測試4:
訪問:/Test1/Test2/ ~* /Test1/(\w+)$是嚴格以字母或數字結尾 所以正則匹配不上,走最長前綴匹配 ‘longest prefix string match!’ (\w:用于匹配字母,數字或下劃線字符)
測試5:
訪問:/test1/Test2 這個時候不區分大小寫的正則表達式都匹配不上,因為要以字母或數字結尾,所以走普通匹配 返回 ‘longest prefix string match!’