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

问题描述 投票:0回答:1

伙计们。

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

我试图找到正确的方法来转换这个规则。

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

根据我的理解,它的意思是 "如果请求的文件名以web开头,但不包含字符串'-staging',那么使用307 HTTP重定向,重定向到不包含web的相同URI。

我一直在尝试使用Location来得到这个,然后再使用regex,(试图防止使用邪恶的 "if"),但是没有办法,这超出了我的知识范围。

谁能帮助我弄清楚如何正确地得到这个(网站将有大量的流量,所以,寻找一些优化),请?先谢谢你。

regex apache nginx nginx-reverse-proxy
1个回答
1
投票

你可以在这种情况下使用否定式的regex断言(关于这个主题的好文章是 此处):

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

为了获得更好的性能,我建议启用并使用... ... PCRE JIT. 请注意,你的系统PCRE库必须是在启用了这个功能的情况下编译的(或者你可以自己从源码中编译出带有自定义PCRE库的nginx)。

© www.soinside.com 2019 - 2024. All rights reserved.