【问题标题】: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";
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-26
      • 1970-01-01
      • 2020-09-11
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      相关资源
      最近更新 更多