使用mod_rewrite进行语言重定向

时间:2011-05-31 18:53:09

标签: .htaccess mod-rewrite redirect

我有一个以7种语言提供的网站。

我希望只有在用户访问主页时才能基于浏览器语言重定向用户。这是为了增加有机交通的可用性。我需要将此重定向仅应用于主页,因为该网站还会发送特定于每种语言的邮件程序,如果用户被重定向,它们将无法正常工作。

此外,每种语言都是子域。即www.site.com for English和de.site.com for German。 邮件程序URL类似于:www.site.com/home/login?query=string

如果可能,我想用.htaccess文件执行此操作。

有人能提供见解吗?

感谢。

2 个答案:

答案 0 :(得分:7)

由于您只想在主页上重定向,您可以这样做(假设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/

答案 1 :(得分: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

Notes&说明

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