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/