Regex 如果请求URI不包含某些单词,如何在nginx中重定向

Regex 如果请求URI不包含某些单词,如何在nginx中重定向,regex,nginx,nginx-location,Regex,Nginx,Nginx Location,我使用nginx来提供静态新闻,比如页面。 在顶层有 https://example.com/en/news/提供文章概述。 单个项目的URL与此类似:https://example.com/en/news/some-article 所有URL都包含该语言,即/en/或/de/。 我想创建一个规则,将不包含该语言的请求重定向到正确的URL(该语言基于IP映射,可通过$lang) 以下操作应该有效(en示例): 我的尝试看起来像这样 location ~* /news/.*$ { if (

我使用nginx来提供静态新闻,比如页面。 在顶层有
https://example.com/en/news/
提供文章概述。 单个项目的URL与此类似:
https://example.com/en/news/some-article

所有URL都包含该语言,即
/en/
/de/
。 我想创建一个规则,将不包含该语言的请求重定向到正确的URL(该语言基于IP映射,可通过
$lang

以下操作应该有效(
en
示例):

我的尝试看起来像这样

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

到目前为止,这导致了无限的重定向。

我觉得你的解决方案太复杂了。并且使用一个尾随的
$
测试
$request\u uri
将永远不会匹配重写的uri(因此循环)

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

假设您已在其他地方计算了
$lang
的值,这可能适用于您:

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

只有在配置中存在可能冲突的正则表达式
位置
块时,才需要使用
^
修饰符。更多信息,请参阅。

看看这篇文章:谢谢,这很有帮助-甚至避免了
if
,我认为这更棒。
location ^~ /news/ {
    return 302 /$lang$request_uri;
}