NGinx - 重写匹配字符串而不是第二个 URI 的正确方法

NGinx - Right way to rewrite URI matching a string and not the second

伙计们,

我正在将使用前端 Apache 反向代理的应用程序迁移到 NGinx 反向代理。

我正在尝试找到转换此规则的正确方法:

RewriteCond %{REQUEST_FILENAME} ^/web
RewriteCond %{REQUEST_FILENAME} !^/(.*)-staging/(.*)
RewriteRule /web/?(.*)$ https://mydomainename/ [L,NE,QSA,R=307]

根据我的理解,这意味着“如果请求的文件名以 /web 开头,但不包含字符串 '-staging/',则使用 307 HTTP 重定向到不带 /web 的同一 URI重定向。

我一直在尝试使用位置来获取它,然后使用正则表达式(试图防止使用邪恶 "if"),但没办法,这超出了我的知识范围。

有人能帮我想想如何正确地得到这个吗(网站流量很大,所以,寻找优化的东西),好吗?提前谢谢你。

对于这种情况,您可以使用否定正则表达式断言(关于这个主题的好文章是 here):

location ~ ^/web/?(?!.*-staging/)(.*)$ {
    return 307 https://mydomainname/$is_args$args;
}

为了获得更好的性能,我建议启用并使用 PCRE JIT。请注意,您的系统 PCRE 库必须在启用此功能的情况下进行编译(或者您可以自己使用自定义 PCRE 库从源代码构建 nginx)。