我正在使用nginx来提供类似静态消息的页面。 在顶层有https://example.com/en/news/
以及文章的概述。 单个项目的URL类似于: https://example.com/en/news/some-article
: https://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
块时,才需要^~
修饰符。 请参阅此文档了解更多