Nginx location配置類別和匹配優(yōu)先級

location功能:

匹配的ngnix變量:$request_uri
作用:定義url匹配模式,可以根據(jù)請求uri判斷相應配置
配置文件中一般有多個location,分別定義了不同的匹配模式,不同的uri根據(jù)匹配結果獲取不同的配置。

location的匹配模式:

location的匹配都是前綴匹配。格式:

location [ 空格 | = | ~ | ~* | !~ | !~* ] /uri/ {}

分為3類:

  • 精確模式:精確匹配(=)
  • 前綴模式: 普通匹配(空格),非正則匹配(^~)
  • 正則模式: 大小寫敏感匹配(~),大小寫不敏感匹配(~*),大小寫敏感不匹配(!~),大小寫不敏感不匹配(!~*)

location匹配優(yōu)先級:

  1. 先匹配精確模式,命中精確模式,直接返回。否則,繼續(xù)匹配前綴模式。
  2. 前綴模式中使用最大前綴原則,選出匹配普通匹配(空格)或非正則匹配(^~)的最長location。
  3. 若最長前綴location是非正則匹配(^~),則返回該最長前綴location。否則,還需要繼續(xù)匹配正則模式。
  4. 正則模式的原則是按照正則location定義順序匹配,第一個匹配的location為正則模式結果。
  5. 若正則模式匹配成功,返回正則模式結果。否則,返回前綴模式中的最長前綴location。
  6. 在nginx版本0.7.1 - 0.8.41中,若前綴模式的最長前綴location精確匹配uri,直接返回最長前綴location。
if 精確匹配結果
    return  精確匹配結果
最長前綴結果 = longest: 普通匹配(空格) or 非正則匹配(^~)
if 最長前綴結果 屬于 非正則匹配(^~)
    return 最長前綴結果
if 版本 屬于 0.7.1 - 0.8.41 and 最長前綴結果 == uri:
    return 最長前綴結果
首個正則結果 = first: 大小寫敏感匹配(~) or 大小寫不敏感匹配(~*) or 大小寫敏感不匹配(!~) or 大小寫不敏感不匹配(!~*)
if 首個正則結果:
    return 首個正則結果
else:
    return 最長前綴結果

示例

location / {}

前綴模式,匹配所有uri,最短匹配
所以,這個location為兜底location。即當其他所有l(wèi)ocation都不匹配時,命中這個location。

location = / {
    [ 配置 A ]
}

location / {
    [ 配置 B ]
}

location /documents/ {
    [ 配置 C ]
}

location ^~ /images/ {
    [ 配置 D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ 配置 E ]
}

uri:“/”
精確匹配:配置 A
uri:“/index.html”
兜底匹配:配置 B
uri:“/documents/document.html”
最長location匹配:配置 C
uri:“/images/1.gif”
非正則匹配:配置 D
uri:“/documents/1.jpg”
正則匹配:配置 E

內部location(@)

內部location不能被外部 Client 所訪問,只能用于重定向。它不能被嵌套,也不能包含嵌套的location。格式為:

location @name {}

示例:

error_page 404 = @fallback
location @fallback {
}

特殊處理location

若前綴模式location以斜杠(/)結尾,并且請求設置由proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass或 memcached_pass等處理器處理,則使用該處理器處理。
但對于末尾不帶斜杠的uri,這時會返回301并重定向到帶斜杠的uri,繼而匹配該location。

location /user/ {
    proxy_pass http://user.example.com;
}

uri: /user/
轉發(fā)到ttp://user.example.com
uri:/user
返回301,并重定向到/user/
如果不希望自動重定向,可以定義兩個location,設置不同配置:

location /user/ {
    proxy_pass http://user.example.com;
}
location = /user {
    proxy_pass http://login.example.com;
}

```
uri:/user/
轉發(fā)到http://user.example.com;
uri:/user
轉發(fā)到http://login.example.com;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容