Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess Htaccess语言重定向310错误_.htaccess_Redirect - Fatal编程技术网

.htaccess Htaccess语言重定向310错误

.htaccess Htaccess语言重定向310错误,.htaccess,redirect,.htaccess,Redirect,我有一个两种语言的网站 Swedish side www.site.com English side www.site.com/?lang=en 我正在使用 RewriteEngine on RewriteCond %{HTTP:Accept-Language} (aa|ab|af|am|ar|as|ay|az|ba|be|bg|bh|bi|bn|bo|br|ca|co|cs|cy|da|de|dz|el|en|eo|es|et|eu|fa|fi|fj|fo|fr|fy|ga|gd|gl|

我有一个两种语言的网站

Swedish side  www.site.com
English side  www.site.com/?lang=en
我正在使用

RewriteEngine on
RewriteCond %{HTTP:Accept-Language} (aa|ab|af|am|ar|as|ay|az|ba|be|bg|bh|bi|bn|bo|br|ca|co|cs|cy|da|de|dz|el|en|eo|es|et|eu|fa|fi|fj|fo|fr|fy|ga|gd|gl|gn|gu|ha|hi|hr|hu|hy|ia|ie|ik|in|is|it|iw|ja|ji|jw|ka|kk|kl|km|kn|ko|ks|ku|ky|la|ln|lo|lt|lv|mg|mi|mk|ml|mn|mo|mr|ms|mt|my|na|ne|nl|no|oc|om|or|pa|pl|ps|pt|qu|rm|rn|ro|ru|rw|sa|sd|sg|sh|si|sk|sl|sm|sn|so|sq|sr|ss|st|su|sw|ta|te|tg|th|ti|tk|tl|tn|to|tr|ts|tt|tw|uk|ur|uz|vi|vo|wo|xh|yo|zh|zu) [NC]
RewriteRule .* www.site.com/?lang=en [L]
将除瑞典语以外的所有语言输入
www.site.com/?lang=en
,但我最终进入了一个310循环。
缺少什么?

您需要添加对
语言的检查,以确保不会循环

RewriteEngine on
RewriteCond %{QUERY_STRING} !(&|^)lang=
RewriteCond %{HTTP:Accept-Language} (aa|ab|af|am|ar|as|ay|az|ba|be|bg|bh|bi|bn|bo|br|ca|co|cs|cy|da|de|dz|el|en|eo|es|et|eu|fa|fi|fj|fo|fr|fy|ga|gd|gl|gn|gu|ha|hi|hr|hu|hy|ia|ie|ik|in|is|it|iw|ja|ji|jw|ka|kk|kl|km|kn|ko|ks|ku|ky|la|ln|lo|lt|lv|mg|mi|mk|ml|mn|mo|mr|ms|mt|my|na|ne|nl|no|oc|om|or|pa|pl|ps|pt|qu|rm|rn|ro|ru|rw|sa|sd|sg|sh|si|sk|sl|sm|sn|so|sq|sr|ss|st|su|sw|ta|te|tg|th|ti|tk|tl|tn|to|tr|ts|tt|tw|uk|ur|uz|vi|vo|wo|xh|yo|zh|zu) [NC]
RewriteRule .* http://www.site.com/?lang=%1 [L]
请注意,
%1
是对上一次重写中匹配的两个字母的语言代码的反向引用。该规则的另一点需要注意的是,像
/something/file.html
这样的请求将被重定向到
http://www.site.com/?lang=(两个字母的语言代码)
。基本上,原来的路径丢失了。如果要保留它,需要匹配并使用反向引用:

RewriteRule ^(.*)$ http://www.site.com/$1?lang=%1 [L]

如果您还希望传递以前的查询字符串,例如,
/something/file.php?a=b
,则需要在括号中添加
QSA
,以便将其重定向到
http://www.site.com/somthing/file.php?lang=(两个字母的语言代码)&a=b

谢谢!代码工作得很好,但我意识到firefox和chrome都有瑞典语和英语en+eng us作为默认语言,这意味着它们仍将被定向到英语端。我需要什么代码来避免这种情况?重写条件应该同时匹配“en”和“eng”,并且只使用“en”部分。不明白。。大多数瑞典浏览器有两种语言en和sv。由于HTTP:Accept语言检测到英语是一种安装的语言,它会将瑞典用户重定向到/?lang=en。也许更好的解决方案是将整个www.site.com重定向到www.site.com/?lang=en,但要为sv语言添加一个例外。但是我不确定这是不是最好的方法,我不知道怎么写。如果你要做更复杂的事情,你应该写一个脚本。因为如果一个浏览器说它接受“en”,而不是使用“en”(即使浏览器说它接受它),你想要仔细地解析接受语言以寻找更好的语言,mod_rewrite不会切断它。以下是有关使用
Accept Language
确定区域设置的更多信息: