Regex 如果请求URI不包含某些单词,如何在nginx中重定向
我使用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 (
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;
}