如果请求 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。
我正在使用 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/
.
假设您已经在别处计算了 $lang
的值,这可能对您有用:
location ^~ /news/ {
return 302 /$lang$request_uri;
}
仅当配置中的正则表达式 location
块可能发生冲突时,才需要 ^~
修饰符。有关更多信息,请参阅 this document。