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

时间:2017-09-12 15:01:00

标签: regex nginx nginx-location

我正在使用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;
    }
}

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

1 个答案:

答案 0 :(得分:1)

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

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

假设您已在其他地方计算过$lang的值,这可能对您有用:

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

只有在配置中有可能发生冲突的正则表达式^~块时,才需要location修饰符。有关详情,请参阅this document