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

How to redirect in nginx if request URI does not contain certain words

我正在使用 nginx 来提供类似新闻的静态页面。 在顶层有 https://example.com/en/news/ 包含文章概览。 个别项目有一个 URL 类似于:https://example.com/en/news/some-article

所有 URL 都包含该语言,即 /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;
    }
}

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

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

您可以使用前缀 location 来仅匹配以 /news/.

开头的 URI

假设您已经在别处计算了 $lang 的值,这可能对您有用:

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

仅当配置中的正则表达式 location 块可能发生冲突时,才需要 ^~ 修饰符。有关更多信息,请参阅 this document