談Nginx的Location匹配優先順序
Nginx的配置檔案中的Location用於匹配特定的URI,如果location後面的規則匹配了URI,並且匹配在此處停止向後匹配,則應用該location下面的規則,反之繼續進行匹配,直到匹配到相應的規則或匹配到預設的規則。
這篇文章單就location的定位進行討論,其它的部分不進行解析。
本文解決的問題:
location為什麼重要?
location 相當於選擇,選中。當我們處理某件事情,往往必須選中,然後再進行進一步的動作。比如處理word時,對某段文字應用字型,肯定是先選中,然後再應用規則。location就是這個意思,選擇的物件就是URI,根據不同的URI,使用不同的規則,location就是第一步,只有這一步正確,其餘的部分才能保證順利進行。
location該如何配置?
- location的幾種匹配方式
普通匹配:
location = URI { configuration } #精確匹配
location ^~ URI { configuration } #非正則匹配
location [space] URI { configuration} # # 字首匹配
正則匹配
location ~ URI { configuration } #大小寫敏感匹配
location ~* URI { configuration } #大小寫不敏感匹配
- 幾種匹配方式的優先順序
整體規則按照先普通匹配,然後再正則匹配,如果正則不匹配,則回退至上一個普通匹配。其中普通匹配沒有順序之分,哪個匹配最精確,就使用哪個location,正則匹配按照規則的書寫順序進行。
= 精確匹配,匹配後停止後續匹配,直接執行該匹配後的configuration.
[空格] 字首匹配,匹配後,繼續更長字首匹配和正則匹配。
^~ 非正則匹配,匹配該規則後,停止繼續正則匹配。
~ 區分大小寫的正則匹配,按順序匹配,一旦匹配上即停止後續匹配。
~* 不區分大小寫的匹配,一旦匹配即停止後續匹配。
- 幾種匹配規則的相同點和不同點
首先對幾種匹配符號進行編號:
符號 |
編號 |
= |
1 |
空格 |
2 |
^~ |
3 |
~ |
4 |
~* |
5 |
1 vs 2
相同點: 2的特殊情況(隱式精確匹配)會等於1
相同點: 2的特殊情況(隱式精確匹配)會等於1
不同點: 1匹配後停止後續的正則匹配,2 匹配後還要看有沒有更長的字首可以匹配,和有沒有後續的正則匹配。
1 vs 3
相同點:都停止後續的正則匹配,即即使有正規表示式可以匹配的上,也不會匹配。
不同點: 3 匹配後還要繼續進行最大字首匹配,如果有更精確的匹配可以用,就使用該條匹配。
相同點:都停止後續的正則匹配,即即使有正規表示式可以匹配的上,也不會匹配。
不同點: 3 匹配後還要繼續進行最大字首匹配,如果有更精確的匹配可以用,就使用該條匹配。
1 和 4 5 是兩類不同的匹配方式,匹配了1 就意味著,45都忽略。
2 vs 3 :
相同點:匹配後都執行最大字首匹配,
不同點: 2 進行最大字首匹配後還要進行正則匹配,3 匹配後停止正則匹配。
示例:
如果URI相同,則location [] /test 和 location ^~ /test 相同,報錯如下:
nginx: [emerg] duplicate location "/test" in /data/nginx/conf/nginx.conf:42
由此可見, ^~ 和 空格 在URI相同的情況下,是同樣的意思,所以報如上錯誤。
演示:
相同點:匹配後都執行最大字首匹配,
不同點: 2 進行最大字首匹配後還要進行正則匹配,3 匹配後停止正則匹配。
示例:
如果URI相同,則location [] /test 和 location ^~ /test 相同,報錯如下:
nginx: [emerg] duplicate location "/test" in /data/nginx/conf/nginx.conf:42
由此可見, ^~ 和 空格 在URI相同的情況下,是同樣的意思,所以報如上錯誤。
演示:
在以下路徑中
/data/nginx/zzp/exact/
/data/nginx/zzp/regex/
建立同名但不同內容的檔案,然後使用curl -v
發現,正規表示式部分會生效,由此證明,經過普通匹配後的URI,再繼續進行regex匹配,regex匹配上之後,regex生效。
location /zzp/ {
alias /data/nginx/zzp/exact/;
}
location ~ ^/zzp/(.*\.html)$ {
alias /data/nginx/zzp/regex/$1;
}
使用取消正規表示式符號 ^~,然後再請求相同的連結,發現exact路徑下的檔案被訪問,證明,普通匹配執行後不再進行正規表示式匹配。
location ^~ /zzp/ {
alias /data/nginx/zzp/exact/;
}
location ~ ^/zzp/(.*\.html)$ {
alias /data/nginx/zzp/regex/$1;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29757574/viewspace-2147776/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- nginx的location匹配順序、優先順序,location對映衝突排查Nginx
- Nginx配置指令location匹配符優先順序和安全問題Nginx
- Nginx location 在配置中的優先順序Nginx
- nginx location規則優先順序比較Nginx
- Nginx的location規則:優先順序和路徑替換Nginx
- nginx快取優先順序Nginx快取
- 高效能Web伺服器Nginx的配置與部署研究(16)小議location匹配模式優先順序Web伺服器Nginx模式
- 42. nginx 匹配的 try_file 與前端路由的優先順序問題Nginx前端路由
- CSS優先順序CSS
- Nginx中的一些匹配順序Nginx
- 中斷優先順序
- python運算子及優先順序順序Python
- nginx location匹配規則Nginx
- Nginx Location 路徑匹配Nginx
- [譯]HTTP/2的優先順序HTTP
- CSS的處理優先順序CSS
- Android程式優先順序Android
- SQL 優先順序join>whereSQL
- java運算子優先順序Java
- php運算子優先順序PHP
- css優先順序彙總CSS
- css選擇器的優先順序CSS
- 警惕執行緒的優先順序執行緒
- 併發請求的優先順序
- CSS 選擇器的優先順序CSS
- 徹底弄懂 Nginx location 匹配Nginx
- java setPriority()設定優先順序Java
- 封裝優先順序佇列封裝佇列
- Yarn任務優先順序配置Yarn
- gitignore優先順序小結Git
- css 選擇器優先順序CSS
- java執行緒優先順序Java執行緒
- 資料型別優先順序資料型別
- 深入理解css優先順序CSS
- NLS引數優先順序解析
- 華為路由協議優先順序路由協議
- C++運算子優先順序C++
- 一文弄懂Nginx的location匹配Nginx