mod_rewrite使用浏览器语言和非www域

时间:2013-01-12 03:53:11

标签: apache mod-rewrite

我正在使用以下规则将域名重定向到基于浏览器语言的网站的EN版本:

RewriteCond %{HTTP:Accept-Language} ^en.*$ [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /en [L,R=302]

这适用于www.domain.com,但无法从now-www重定向到www。 例如,无法将http://domain.com重定向到http://www.domain.com/en,这就是我想要实现的目标。

我应该在规则中添加什么? 谢谢!

1 个答案:

答案 0 :(得分:5)

要将非www重定向到www,请在问题中添加此规则集,如下所示:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R=301]

#This is the rule set in the question:
RewriteCond %{HTTP:Accept-Language} ^en.*$ [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /en [L,R=302]

由于您说实际规则集工作正常,但www问题除外,我没有对其进行修改或测试。

最高规则规则的作用是将www插入所有网址。就这样。它与您问题中的规则无关,但如果您想将转换限制为仅限EN语言,请移动此行:

RewriteCond %{HTTP:Accept-Language} ^en.*$ [NC]

在最后一个规则集中,到第一个规则集,如下所示:

....
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteCond %{HTTP:Accept-Language} ^en.*$ [NC]
....

方法

要重定向所有与之前语言规则不匹配的请求,请在所有语言规则之后将以下行放在底部。

RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /en [L,R=302]

默认情况下,它会将所有传入的请求重定向到英语部分。

因此,您的.htaccess文件应如下所示:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R=301]

RewriteCond %{HTTP:Accept-Language} ^sv.*$ [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /sv [L,R=302]

RewriteCond %{HTTP:Accept-Language} ^nb.*$ [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /nb [L,R=302]

RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} !(^q\=) [NC]
RewriteRule ^(.*)$ /en [L,R=302]

我建议您将所有R=302替换为R=301。这对SEO来说更好。