【问题标题】:Non-greedy nginx location regex returning a 404 error非贪婪的 nginx 位置正则表达式返回 404 错误
【发布时间】:2015-02-16 10:09:21
【问题描述】:

我想配置一个 nginx location directive,它将重定向以下 URL:

/api/v2/<map_id>/region

收件人:

http://SOME-URL/api/v2/<map_id>/region

其中map_id 是任何不包含/ 的字符串。

我试过了:

location /api/v2/((?U).*)/region {
    proxy_pass http://SOME-URL/api/v2/$1/region;
}

但我仍然收到 404 错误。我也尝试用$2 替换$1,但没有成功。

任何想法如何修复这个正则表达式?

更新 - 修复了地区/地区差异。

【问题讨论】:

    标签: regex nginx pcre


    【解决方案1】:

    首先,region 和 regions 之间存在差异。那肯定能做到。

    其次,您可以像这样使用否定字符类:

    /api/v2/([^/]*)/region
    

    您可能还需要在其中转义一些斜线,尽管我不完全确定 Nginx 需要什么。

    在任何 PCRE 正则表达式中,您都需要这样做:

    \/api\/v2\/([^\/]*)\/region
    

    这里正在处理 regex101:https://regex101.com/r/mT3xB9/1

    【讨论】:

    • 如何将正则表达式设置为非贪婪?
    • 在* 之后使用?,如下所示:\/api\/v2\/([^\/]*?)\/region。但是,由于您明确知道自己不想要什么角色,所以它不会对比赛产生任何影响。
    • 不,/api/v2/([^/]*)/region 无法捕获 /api/v2/x/region。
    • 如果你转义反斜杠 \/,它会在 regex101 上运行。我没有 Nginx 环境可以玩,但大多数其他正则表达式引擎都需要转义的黑斜线。
    • 感谢您的努力,@remus!看来我的问题不是源于 PCRE 语法,而是来自 NGinx 特质 - 请参阅我的答案。
    【解决方案2】:

    一个~是所有痛苦的根源:

    In order to use regular expressions, you must always use a prefix:

    "~" 必须用于区分大小写匹配

    "~*" 必须用于不区分大小写的匹配

    所以:

    location ~ /api/v2/([^/]*)/region {
        proxy_pass http://SOME-URL/api/v2/$1/region;
    }
    

    成功了 - ?U 部分甚至没有必要。

    /var/log/nginx/error.log 的错误日志提供了有用的线索:

    2014/12/21 12:54:59 [emerg] 7506#0: invalid URL prefix in /etc/nginx/sites-enabled/super_secret_filename_dont_share_on_so.conf:42
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 2015-08-25
      • 1970-01-01
      • 2011-04-27
      • 2010-10-20
      • 1970-01-01
      相关资源
      最近更新 更多