我正在尝试使用 nginx 和重定向规则实现某些目标,这似乎应该非常简单,但我遇到了障碍。
浏览过许多问题和答案后,我似乎找不到适合我的解决方案。
我想要实现的目标如下:
如果有人通过以下任何一个 URL 导航到我的网站:
http://mywebsite.com
http://mywebsite.com/
http://mywebsite.com/foo
该人将被重定向至:
http://mywebsite.com/en/
http://mywebsite.com/en/
http://mywebsite.com/en/foo/
以下是我目前在 nginx 配置文件中的内容(按文件中的顺序排列):
location ^/en/(.*) {
try_files $uri /index.php$is_args$args last;
}
location / {
if ( $uri !~ ^/(index\.php|css|jpg|png|images|core|uploads|js|robots\.txt|favicon\.ico) ) {
return 301 /en/$uri;
}
}
但是,使用上述配置,我陷入了无限重定向循环,在服务器放弃之前,地址栏中的 URL 最终会变成这样:
http://mywebsite.com/en//en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/
有人可以吗:
a) 向我解释为什么我的配置没有达到预期的效果,以便我能够理解,避免将来重复同样的错误
b)提出一个可行的解决方案,并尽可能改进我的配置
c) 如果可能的话,请进一步举例说明如何让 nginx 自动确定与请求相关的语言环境并动态转换请求以按照上述方式包含它。
谢谢
答案1
向我解释为什么我的配置没有达到预期的效果,以便我能够理解,并且不会在将来重复同样的错误
location ^/en/(.*)
不是有效指令。
您可能对 感到困惑。这将匹配以 开头,后跟任何内容的location ^~ /en/(.*)
任何查询。/en/
实际上,请求总是与指令匹配location /
,因此它会使您陷入无限循环。
提出一个可行的解决方案,并尽可能改进我的配置
只需在指令中使用路径前缀location
:
location /en/ {
try_files $uri $uri/ =404;
}
location / {
return 301 /en$uri;
}