5

我使用以下规则根据浏览器语言将域重定向到网站的 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,这就是我想要实现的。

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

4

1 回答 1

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 插入所有 URL。就这样。它独立于您问题中的规则,但如果您只想将该转换限制为 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=302R=301. 更适合 SEO 目的。

于 2013-01-12T22:22:11.063 回答