我正在使用nginx来提供类似静态新闻的页面。
在顶层有
https://example.com/en/news/
概述文章。
单个项目的网址类似于:https://example.com/en/news/some-article
所有网址都包含该语言,即/en/
或/de/
。
我想创建一条规则,将不包含该语言的请求重定向到正确的URL(该语言基于IP映射,可通过$lang
获得)。
以下内容应该有效(en
示例):
/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;
}
}
到目前为止,这导致了无限重定向。
答案 0 :(得分:1)
你的解决方案对我来说似乎过于复杂。使用尾随$request_uri
测试$
将永远不会匹配重写的URI(因此循环)。
您可以使用前缀location
仅匹配以/news/
开头的URI。
假设您已在其他地方计算过$lang
的值,这可能对您有用:
location ^~ /news/ {
return 302 /$lang$request_uri;
}
只有在配置中有可能发生冲突的正则表达式^~
块时,才需要location
修饰符。有关详情,请参阅this document。