【问题标题】:Nginx location with regex in the middle of path正则表达式位于路径中间的 Nginx 位置
【发布时间】:2020-02-14 23:24:16
【问题描述】:
我正在尝试配置 Nginx 以正确解析两个包含正则表达式的相似路径。
我有 2 项服务:
- /api/v1/myservice/{var}/client
- /api/v1/myservice/{var}/client/detail
{var} 是我正在读取的变量
这是我的代码(这里不使用 var):
location ~ /api/v1/myservice/(.*)/client {
return 200 "service 1 ";
}
location ~ /api/v1/myservice/(.*)/client/detail {
return 200 "service 2";
}
当我像下面这样运行 curl 时:
curl http://localhost/api/v1/myservice/623723852/client/detail
我看到来自第一个位置的响应:
“服务 1”
我做错了什么?
谢谢
【问题讨论】:
标签:
regex
nginx
nginx-location
【解决方案1】:
不需要像其他答案那样嵌套位置。 NGINX 中的嵌套位置经常给人一种关于指令继承的错误印象。通常情况下,它们不会被继承,因为 NGINX 无论如何都会选择一个特定的location。出于这些原因,如果可以,请避免嵌套位置。
您可以简单地更改位置的顺序,以便更具体的位置在前。 NGINX 将匹配配置中第一个出现的那个(如果它们都匹配):
location ~ /api/v1/myservice/(.*)/client/detail {
return 200 "service 2";
}
location ~ /api/v1/myservice/(.*)/client {
return 200 "service 1 ";
}
或者,更好一些(出于性能原因),您可以调整您的正则表达式以获得更精确的匹配。那么配置中的位置就无关紧要了:
location ~ ^/api/v1/myservice/(.*)/client$ {
return 200 "service 1 ";
}
location ~ ^/api/v1/myservice/(.*)/client/detail$ {
return 200 "service 2";
}