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

Jos*_* A. 5 apache mod-rewrite

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

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

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

我该怎么加入规则?谢谢!

Fel*_*a A 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]
Run Code Online (Sandbox Code Playgroud)

既然你说实际的规则集工作正常,除了www问题,我没有修改它或测试它.

最高规则规则的作用是将www插入所有URL.就这样.它独立于您的问题中的规则,但如果您只想将转换限制为EN语言,请移动此行:

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

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

....
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteCond %{HTTP:Accept-Language} ^en.*$ [NC]
....
Run Code Online (Sandbox Code Playgroud)

选项

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

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

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

因此,您的.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]
Run Code Online (Sandbox Code Playgroud)

我建议你更换所有R=302R=301.这对SEO来说更好.