我试图用nginx和redirect规则来实现,似乎它应该是非常简单的,但我碰到了一个绊脚石。
仔细查看了许多问题和答案后,我似乎无法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; }