位置指令的发射顺序是什么?
当前回答
来自HTTP核心模块文档:
带有“=”前缀的指令精确匹配查询。如果找到,搜索就会停止。 所有剩余的常规字符串指令。如果匹配使用了“^~”前缀,则停止搜索。 正则表达式,按照它们在配置文件中定义的顺序。 如果#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 ]
}
如果你仍然感到困惑,这里有一个更长的解释。
其他回答
来自HTTP核心模块文档:
带有“=”前缀的指令精确匹配查询。如果找到,搜索就会停止。 所有剩余的常规字符串指令。如果匹配使用了“^~”前缀,则停止搜索。 正则表达式,按照它们在配置文件中定义的顺序。 如果#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 ]
}
如果你仍然感到困惑,这里有一个更长的解释。
它按这个顺序发射。
=(完全) Location = /path ^~(前向匹配) 位置^~ /路径 ~(正则表达式区分大小写) 位置~ /路径/ ~*(正则表达式不区分大小写) 位置~* .(jpg|png|bmp) / 位置/路径
位置的计算顺序如下:
Location = /path/file。ext{}完全匹配 location ^~ /path/{}优先级前缀匹配->最长优先 location ~ /路径?/{}(区分大小写的regexp)和location ~* /paths?/{}(不区分大小写的regexp) ->第一个匹配 location /path/{}前缀匹配->长度优先
优先级前缀匹配(编号2)与公共前缀匹配(编号4)完全相同,但优先级高于任何regexp。
对于这两种前缀匹配类型,最长的匹配获胜。
区分大小写和不区分大小写具有相同的优先级。求值止于第一个匹配规则。
文档说,所有前缀规则都在任何regexp之前计算,但如果一个regexp匹配,则不使用标准前缀规则。这有点令人困惑,并且没有改变上面报告的优先级顺序。
现在有一个方便的在线工具可以测试位置优先级: 位置优先级在线测试
推荐文章
- Nginx - client_max_body_size没有效果
- 如何在NGINX配置中对两个位置有相同的规则?
- 在子域上配置nginx的多个位置和不同的根文件夹
- Nginx 403错误:[folder]的目录索引被禁止
- Kubernetes服务外部ip挂起
- Nginx位置优先级
- 如何清除nginx的缓存?
- Nginx错误连接到php5-fpm。sock failed(13:权限被拒绝)
- 从上游读取响应报头时,上游发送了太大的报头
- nginx: [emerg] bind() to [::]:80 failed(98:地址已被使用)
- 默认的公共www位置?
- 当连接到upstream的时候:[nginx]
- 哪里可以找到nginx的错误日志,使用FastCGI和Django?
- Nginx no-www到www和www到no-www
- Nginx——静态文件服务与根和别名混淆