Nginx 位置优先级

问题描述 投票:0回答:4

位置指令按什么顺序触发?

nginx
4个回答
509
投票

来自 HTTP 核心模块文档

  1. 带有“=”前缀的指令与查询完全匹配。如果找到,搜索停止。
  2. 所有剩余的指令都带有常规字符串。如果此匹配使用“^~”前缀,则搜索停止。
  3. 正则表达式,按照它们在配置文件中定义的顺序排列。
  4. 如果#3 产生匹配,则使用该结果。否则,将使用#2 中的匹配项。

文档中的示例:

location  = / {
  # matches the query / only.
  [ configuration A ] 
}
location  / {
  # matches any query, since all queries begin with /, but regular
  # expressions and any longer conventional blocks will be
  # matched first.
  [ configuration B ] 
}
location /documents/ {
  # matches any query beginning with /documents/ and continues searching,
  # so regular expressions will be checked. This will be matched only if
  # regular expressions don't find a match.
  [ configuration C ] 
}
location ^~ /images/ {
  # matches any query beginning with /images/ and halts searching,
  # so regular expressions will not be checked.
  [ configuration D ] 
}
location ~* \.(gif|jpg|jpeg)$ {
  # matches any request ending in gif, jpg, or jpeg. However, all
  # requests to the /images/ directory will be handled by
  # Configuration D.   
  [ configuration E ] 
}

如果仍然令人困惑,这里有一个更长的解释


162
投票

它按此顺序触发。

  1. =
    (完全正确)

location = /path
2.
^~
(正向匹配)
location ^~ /path
3.
~
,
~*
(正则表达式区分大小写和不区分大小写)
location ~ /path/
location ~* .(jpg|png|bmp)
4.
/
location /path


56
投票

现在有一个方便的在线工具可以测试位置优先级:
位置优先在线测试


20
投票

位置按以下顺序评估:

  1. location = /path/file.ext {}
    完全匹配
  2. location ^~ /path/ {}
    优先前缀匹配 -> 最长优先
  3. location ~ /Paths?/ {}
    (区分大小写的正则表达式)and
    location ~* /paths?/ {}
    (不区分大小写的正则表达式)-> 第一个匹配项
  4. location /path/ {}
    前缀匹配 -> 最长优先

优先级前缀匹配(数字 2)与公共前缀匹配(数字 4)完全相同,但优先于任何正则表达式。

对于两种前缀匹配类型,最长的匹配获胜。

区分大小写和不区分大小写具有相同的优先级。评估在第一个匹配规则处停止。

Documentation 表示所有前缀规则都会在任何正则表达式之前进行评估,但如果一个正则表达式匹配,则不使用标准前缀规则。这有点令人困惑,并且不会改变上面报告的优先级顺序的任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.