如果请求URI不包含某些单词,如何在nginx中redirect

我正在使用nginx来提供类似静态消息的页面。 在顶层有https://example.com/en/news/以及文章的概述。 单个项目的URL类似于: https://example.com/en/news/some-articlehttps://example.com/en/news/some-article

所有URL包含语言,即/en//de/ 。 我想创build一个规则,将包含语言的请求redirect到正确的URL(该语言是基于可通过$lang获得的IP映射的)。

以下应该工作(例如):

 /news/ --- redirect ---> /en/news/ /news/some-article --- redirect ---> /en/news/some-article 

我的尝试看起来像这样

 location ~* /news/.*$ { if ($request_uri !~* /(de|en)/$) { return 302 https://example.com/$lang/$request_uri; } } 

到目前为止,这导致了无限的redirect。

您的解决方案似乎对我来说过于复杂。 测试$request_uri跟踪$将永远不会匹配重写的URI(因此循环)。

您可以使用前缀location来匹配以/news/开头的URI。

假设你已经为其他地方的$lang计算了一个值,这可能适用于你:

 location ^~ /news/ { return 302 /$lang$request_uri; } 

只有在配置中有可能冲突的正则表达式location块时,才需要^~修饰符。 请参阅此文档了解更多