【问题标题】:nginx location match rule, without matching trailing charactersnginx位置匹配规则,不匹配尾随字符
【发布时间】:2018-10-24 23:27:07
【问题描述】:
我有以下规则:
location /foo {
与以下示例非常匹配:
mydomain.com/foo
mydomain.com/foo/
mydomain.com/foo/bar?example=true
但它也匹配
mydomain.com/foobar
我不希望它与最后一个 (/foobar) 匹配,它应该仅在 foo 后面没有任何内容,或者后面没有斜线和零个或多个字符的情况下匹配。我已经尝试过 location /foo/ {,但这也没有产生预期的结果。
谁能解释一下如何做到这一点?
【问题讨论】:
标签:
nginx
nginx-location
nginx-reverse-proxy
【解决方案1】:
有两种方法可以处理这个问题,使用正则表达式 location 块 - 或者只处理 /foo 和 /foo/。
正则表达式 location 块具有不同的评估顺序,效率低于前缀 location 块,因此我首选的解决方案是完全匹配 location 和前缀 location。
一般情况下,/foo 只是重定向到/foo/,例如:
location = /foo {
return 302 /foo/;
}
location /foo/ {
...
}
请参阅this document 了解更多信息。
【解决方案2】:
您可以为 /foobar 创建一个 Location 规则,无论您是否需要它作为例外:
location = /foobar {
....
}
Nginx 通过 = 操作符匹配第一个 URI。