談Nginx的Location匹配優先級


Nginx的配置文件中的Location用於匹配特定的URI,如果location后面的規則匹配了URI,並且匹配在此處 停止 向后匹配 ,則應用該location下面的規則,反之繼續進行匹配,直到匹配到相應的規則或匹配到默認的規則。

這篇文章單就location的定位進行討論,其它的部分不進行解析。

本文解決的問題:
l ocation為什么重要?
location 相當於選擇,選中。當我們處理某件事情,往往必須選中,然后再進行進一步的動作。比如處理word時,對某段文字應用字體,肯定是先選中,然后再應用規則。location就是這個意思,選擇的對象就是URI,根據不同的URI,使用不同的規則,location就是第一步,只有這一步正確,其余的部分才能保證順利進行。


location該如何配置?


  1. location的幾種匹配方式



普通匹配
location = URI { configuration } #精確匹配
location ^~ URI { configuration } #非正則匹配
location [space] URI { configuration} # # 前綴匹配
 

正則匹配
location ~ URI { configuration } #大小寫敏感匹配
location ~* URI { configuration } #大小寫不敏感匹配

 


  1. 幾種匹配方式的優先級


整體規則按照先普通匹配,然后再正則匹配,如果正則不匹配,則回退至上一個普通匹配。其中普通匹配沒有順序之分,哪個匹配最精確,就使用哪個location ,正則匹配按照 規則的書寫順序 進行。
 
= 精確匹配,匹配后 停止 后續匹配,直接執行該匹配后的configuration.
[空格] 前綴匹配,匹配后,繼續更長前綴 匹配和正則匹配。
^~ 非正則匹配,匹配該規則后,停止繼續正則匹配。
~ 區分大小寫的正則匹配,按順序匹配,一旦匹配上即停止后續匹配。
~* 不區分大小寫的匹配,一旦匹配即停止后續匹配


  1. 幾種匹配規則的相同點和不同點



首先對幾種匹配符號進行編號:

 

符號
編號
=
1
空格
2
^~
3
~
4
~*
5

 
1 vs 2
      相同點: 2的特殊情況(隱式精確匹配)會等於1 
不同點: 1匹配后停止后續的正則匹配,2 匹配后還要看有沒有 更長的前綴可以匹配,和有沒有 后續的正則匹配

1 vs 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相同的情況下,是同樣的意思,所以報如上錯誤。


演示:
在以下路徑中
/data/nginx/zzp/exact/
/data/nginx/zzp/regex/
創建同名但不同內容的文件,然后使用curl -v http://host/a.html
發現,正則表達式部分會生效,由此證明,經過普通匹配后的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;
}


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM