2011-05-31 90 views
3

我有一个网站,提供7种语言。语言重定向mod_rewrite

我想只能在用户访问主页时才能根据浏览器语言重定向用户。这是为了增加可用性,当涉及到有机流量。我需要这个重定向,只适用于主页,因为网站也发送特定于每种语言的邮件程序,并且如果用户被重定向,它们将不起作用。

此外,每种语言都是一个子域。即用于英语的www.site.com和用于德语的de.site.com。 邮件程序的URL看起来类似于:www.site.com/home/login?query=string

如果可能,我想用.htaccess文件来做到这一点。

任何人都可以提供见解?

谢谢。

回答

7

既然你只需要在您的主页重定向一段时间,你可以这样做(assumging www.xyz.com是您的主页)

RewriteCond %{HTTP:HOST} www.xyz.com // user visiting default 
RewriteCond %{HTTP:Accept-Language} ^de [NC] // browser language German 
RewriteRule ^$ de.xyz.com [L,R=301] // R=302 if you need temporary redirect 

http://tech-blog.borychowski.com/index.php/2009/03/htaccess/redirect-according-to-browser-language-mod-rewrite-and-http_accept_language/

+0

我必须指定'HTTP:为了防止相对重定向// de.xyz.com'(我不想),但否则,听起来很好! – adampetrie 2011-06-01 13:13:29

1

这是一种改进方案Rizwan's answer,太多的编辑或评论(我试过)。

我假设你只想在用户访问默认域名的主页(这里是www.xyz.com,而不是de.xyz.com等)时重定向。这里是你如何能做到这一点(以下these instructions):

RewriteCond %{HTTP:HOST} www.xyz.com   // Visit to default domain. 
RewriteCond %{HTTP:Accept-Language} ^de [NC] // Browser language German. 
RewriteRule ^$ http://de.xyz.com/  [L,R=301] 

RewriteCond %{HTTP:HOST} www.xyz.com 
RewriteCond %{HTTP:Accept-Language} ^it [NC] 
RewriteRule ^$ http://it.xyz.com/  [L,R=301] 

# etc. for your other 5 languages 

注&说明

  • R=301是永久重定向,这通常会被浏览器缓存。这会限制您稍后更改重定向目标的选项,因此您可以考虑使用非缓存R=302临时重定向。
  • 通过查看Accept-Language:标头中的第一个值来确定首选语言在大多数情况下都能正常工作,但不符合the standard。它误解了理论上可能的值,如de;q=0.5, en;q=0.9。为了完美地实现这一点,请参阅灵感herehere
  • RewriteRule,^$匹配空字符串,这意味着,“主页”。这是因为Apache将从与[source]中的.htaccess目录对应的文件路径中删除目录前缀。 (在虚拟主机方面,去除/不会发生和模式必须是^/$代替。)