Nginx:redirectURL始终包含一个区域设置前缀

我试图用nginxredirect规则来实现,似乎它应该是非常简单的,但我碰到了一个绊脚石。

仔细查看了许多问题和答案后,我似乎无法find适合我的解决scheme。

我想达到的是以下几点:

如果有人使用以下任何url浏览我的网站:

http://mywebsite.com http://mywebsite.com/ http://mywebsite.com/foo 

该人将被重新导向:

 http://mywebsite.com/en/ http://mywebsite.com/en/ http://mywebsite.com/en/foo/ 

这就是我在我的nginxconfiguration文件中所拥有的文件顺序:

 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; } } 

但是,通过上面的configuration,我正在运行一个无限的redirect循环,并且在服务器放弃之前,地址栏中的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)向我解释为什么我的configuration没有达到预期的效果,所以我可以理解它,不会在未来重复相同的错误

b)提出一个可行的解决scheme,如果可能的话改进我的configuration

c)如果可能的话,进一步说明并用例子说明如何让nginx自动确定与请求相关的语言环境,并dynamic地转换请求,使其包含在上述的方式中。

谢谢

向我解释为什么我的configuration没有达到预期的效果,所以我可以理解它,不会在未来重复相同的错误

location ^/en/(.*)不是有效的指令。

你可能已经与location ^~ /en/(.*)混淆了。 这匹配任何以/en/开头的查询,后面跟着任何内容。

实际上,请求总是与location /指令相匹配,以至于使您陷入无限循环。

提出一个解决scheme,如果可能的话改进我的configuration

只需使用location指令中的path前缀:

 location /en/ { try_files $uri $uri/ =404; } location / { return 301 /en$uri; }