1. 程式人生 > >Nginx 指令之location

Nginx 指令之location

sed mark fix 解釋 通用 ops 大小 編碼 exp

Nginx 指令之location

指令:

  • 語法規則: `location [=|~|~*|^~] /uri/ { … }``
  • 規則解釋:

    = 表示精確匹配
    ^~ 表示uri以某個常規字符串開頭,理解為匹配 url路徑即可。
    ~ 表示區分大小寫的正則匹配
    ~* 表示不區分大小寫的正則匹配
    !~和!~* 分別為區分大小寫不匹配及不區分大小寫不匹配 的正則
    / 通用匹配,任何請求都會匹配到。
    @ 定義一個命名的 location,使用在內部定向時,例如 error_page, try_files

nginx不對url做編碼,因此請求為 /static/20%/aa,可以被規則 ^~ /static/ /aa 匹配到(註意是空格)。

多個location配置的情況下匹配順序為:
首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最後是交給 / 通用匹配。當有匹配成功時候,停止匹配,按當前匹配規則處理請求。

匹配的優先級

  • 與location在配置文件中的順序無關
  • = 精確匹配會第一個被處理。如果發現精確匹配,nginx停止搜索其他匹配
  • 普通字符匹配,正則表達式規則和長的塊規則將被優先和查詢匹配,也就是說如果該項匹配還需去看有沒有正則表達式匹配和更長的匹配。
  • ^~ 則只匹配該規則,nginx停止搜索其他匹配,否則nginx會繼續處理其他location指令。
  • 最後匹配理帶有"~"和"~*"的指令,如果找到相應的匹配,則nginx停止搜索其他匹配;當沒有正則表達式或者沒有正則表達式被匹配的情況下,那麽匹配程度最高的逐字匹配指令會被使用。

location 優先級官方文檔

1. Directives with the = prefix that match the query exactly. If found, searching stops.
2. All remaining directives with conventional strings, longest match first. If this match used the ^~ prefix, searching stops.
3. Regular expressions, in order of definition in the configuration file.
4. If #3 yielded a match, that result is used. Else the match from #2 is used.

1. =前綴的指令嚴格匹配這個查詢。如果找到,停止搜索。
2. 所有剩下的常規字符串,最長的匹配。如果這個匹配使用^?前綴,搜索停止。
3. 正則表達式,在配置文件中定義的順序。
4. 如果第3條規則產生匹配的話,結果被使用。否則,使用第2條規則的結果。

示例

來源: http://www.nginx.cn/115.html

  • 示例
location  = / {
  # 只匹配"/".
  [ configuration A ] 
}
location  / {
  # 匹配任何請求,因為所有請求都是以"/"開始
  # 但是更長字符匹配或者正則表達式匹配會優先匹配
  [ configuration B ] 
}
location ^~ /images/ {
  # 匹配任何以 /images/ 開始的請求,並停止匹配 其它location
  [ configuration C ] 
}
location ~* .(gif|jpg|jpeg)$ {
  # 匹配以 gif, jpg, or jpeg結尾的請求. 
  # 但是所有 /images/ 目錄的請求將由 [Configuration C]處理.   
  [ configuration D ] 
}
  • 請求URI
/ -> 符合configuration A
/documents/document.html -> 符合configuration B
/images/1.gif -> 符合configuration C
/documents/1.jpg ->符合 configuration D
  • @location 例子
error_page 404 = @fetch;

location @fetch(
    proxy_pass http://fetch;
)

Nginx 指令之location