2011-11-15 99 views
0

我有兩個語言網站.htaccess的語言重定向310錯誤

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環結束。 缺什麼?

回答

1

您需要爲lang添加支票以確保您不會循環。

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是一個反向引用,在前面的RewriteCond匹配2字母語言代碼。關於規則要注意的另一件事是,像/something/file.html這樣的請求將被重定向到http://www.site.com/?lang=(2 letter language code)。本質上,原始路徑會丟失。如果你想保持它,你需要匹配和使用反向引用:如果你想前面的查詢字符串也獲得通過

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

,例如,/something/file.php?a=b,你需要在括號內添加QSA,使其將被重定向到http://www.site.com/somthing/file.php?lang=(2 letter language code)&a=b

+0

謝謝!代碼很好,但我意識到firefox和chrome既有瑞典語又有英語en + eng我們作爲默認語言,這意味着他們仍然會被引導到eng側。我需要什麼代碼來避免這種情況? – user1046583

+0

RewriteCond應該匹配「en」和「eng」,並只使用「en」部分。 –

+0

不理解..大多數瑞典語瀏覽器有兩種語言en和sv。由於HTTP:Accept-Language將英語識別爲一種安裝語言,因此它將瑞典用戶重定向到/?lang = en也許更好的解決方案是將整個www.site.com重定向到www.site.com/?lang=en,但要添加對sv語言的豁免。但我不知道這是最好的方式,我不知道如何寫。 – user1046583