Nginx位置优先级

位置指令的发射顺序是什么?

142639 次浏览

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 ]
}

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

它按这个顺序发射。

  1. = < em >(完全)

    location = /path

    李< /引用> < / >
  2. ^~ (正向匹配)

    location ^~ /path

    李< /引用> < / >
  3. ~ (正则表达式区分大小写)

    location ~ /path/

    李< /引用> < / >
  4. ~* (正则表达式不区分大小写)

    location ~* .(jpg|png|bmp)

    李< /引用> < / > <李> /

    location /path

    李< /引用> < / >
现在有一个方便的在线工具可以测试位置优先级:
位置优先级在线测试 < / p >

位置的计算顺序如下:

  1. location = /path/file.ext {}完全匹配
  2. location ^~ /path/ {}优先级前缀匹配最长的第一
  3. location ~ /Paths?/ {}(区分大小写的regexp) 而且 location ~* /paths?/ {}(区分大小写的regexp) ->第一场比赛
  4. location /path/ {}前缀匹配->最长的第一

优先级前缀匹配(编号2)与公共前缀匹配(编号4)完全相同,但优先级高于任何regexp。

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

区分大小写和不区分大小写具有相同的优先级。求值止于第一个匹配规则。

文档表示所有前缀规则都在任何regexp之前求值,但如果一个regexp匹配,则不使用标准前缀规则。这有点令人困惑,并且没有改变上面报告的优先级顺序。