Nginx——location匹配與在配置中的優先級


1. location表達式類型

location ^~ /api/v7/ {
   proxy_next_upstream http_404 http_500 http_502 http_503 http_504  error timeout invalid_header;
   proxy_set_header  Connection "keep-alive";
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_pass http://www.hello.world;
   proxy_set_header tenant-id $tenantId;        
}   

上面是一個location匹配的例子,實際上,location匹配表達式還有多種:

  • ~ 表示執行一個正則匹配,區分大小寫
  • ~* 表示執行一個正則匹配,不區分大小寫
  • ^~ 表示普通字符匹配。使用前綴匹配。如果匹配成功,則不再匹配其他location。
  • = 進行普通字符精確匹配。也就是完全匹配。
  • @ "@" 定義一個命名的 location,使用在內部定向時,例如 error_page, try_files
  • / 通用匹配, 如果沒有其它匹配,任何請求都會匹配到

2. location優先級說明

在nginx的location和配置中location的順序沒有太大關系。與location表達式的類型有關。相同類型的表達式,字符串長的會優先匹配。
以下是按優先級排列說明:
第一優先級:等號類型(=)的優先級最高。一旦匹配成功,則不再查找其他匹配項。
第二優先級:^~類型表達式。一旦匹配成功,則不再查找其他匹配項。
第三優先級:正則表達式類型(~ ~*)的優先級次之。如果有多個location的正則能匹配的話,則使用正則表達式最長的那個。
第四優先級:常規字符串匹配類型。按前綴匹配。

#順序不等於優先級
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)

3. location優先級示例

配置項如下:

location = / {
  # 精確匹配 / ,主機名后面不能帶任何字符串
  [ configuration A ]
}
location
/ {   # 因為所有的地址都以 / 開頭,所以這條規則將匹配到所有請求   # 但是正則和最長字符串會優先匹配   [ configuration B ] }
location
/documents/ {   # 匹配任何以 /documents/ 開頭的地址,匹配符合以后,還要繼續往下搜索   # 只有后面的正則表達式沒有匹配到時,這一條才會采用這一條   [ configuration C ] }
location
~ /documents/Abc {   # 匹配任何以 /documents/ 開頭的地址,匹配符合以后,還要繼續往下搜索   # 只有后面的正則表達式沒有匹配到時,這一條才會采用這一條   [ configuration CC ] }
location
^~ /images/ {   # 匹配任何以 /images/ 開頭的地址,匹配符合以后,停止往下搜索正則,采用這一條。   [ configuration D ] }
location
~* \.(gif|jpg|jpeg)$ {   # 匹配所有以 gif,jpg或jpeg 結尾的請求   # 然而,所有請求 /images/ 下的圖片會被 config D 處理,因為 ^~ 到達不了這一條正則   [ configuration E ] }
location
/images/ {   # 字符匹配到 /images/,繼續往下,會發現 ^~ 存在   [ configuration F ] }
location
/images/abc {   # 最長字符匹配到 /images/abc,繼續往下,會發現 ^~ 存在   # F與G的放置順序是沒有關系的   [ configuration G ] }
location
~ /images/abc/ {   # 只有去掉 config D 才有效:先最長匹配 config G 開頭的地址,繼續往下搜索,匹配到這一條正則,采用   [ configuration H ] }

請求匹配示例

/ -> config A  #精確完全匹配,即使/index.html也匹配不了
/downloads/download.html -> config B    #匹配B以后,往下沒有任何匹配,采用B
/images/1.gif -> configuration D   # 匹配到F,往下匹配到D,停止往下
/images/abc/def -> config D  #最長匹配到G,往下匹配D,停止往下   
                 可以看到 任何以/images/開頭的都會匹配到D並停止,FG寫在這里是沒有任何意義的,H是永遠輪不到的,這里只是為了說明匹配順序
/documents/document.html -> config C #匹配到C,往下沒有任何匹配,采用C /documents/1.jpg -> configuration E #匹配到C,往下正則匹配到E /documents/Abc.jpg -> config CC #最長匹配到C,往下正則順序匹配到CC,不會往下到E

 

參考:https://www.bo56.com/nginx-location%E5%9C%A8%E9%85%8D%E7%BD%AE%E4%B8%AD%E7%9A%84%E4%BC%98%E5%85%88%E7%BA%A7/

 


免責聲明!

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



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