2010-08-06 90 views
0

我正在尝试将博客的访问者重定向到法语或英语版本。 所以我做了这个的.htaccess:.htaccess:语言重定向

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/

#--------------------- 
# Language Redirection 
#--------------------- 
# Checking if the redirection didn't occur yet 
# Checking that the url doesn't begin with /en 
RewriteCond %{REQUEST_URI} !^/en(.*)$ 

# Checking if the user is in english 
RewriteCond %{HTTP:Accept-Language} ^en [NC] 

# Redirecting from /the/url to /en/the/url 
RewriteRule ^(.*)$ /en/$1 [L,R=301] 

#---------------------- 
# Wordpress Redirection 
#---------------------- 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 

基本上,我想我的访问者来自谷歌未来的/我/条重定向到/ EN /我/文章,如果他们是英语。 相反,有一个无限循环!我认为REQUEST_URI始终是index.php,因为最后一个RewriteRule。

有没有人做过这个?

非常感谢

回答

1

Accept-Language不仅仅是一个同等值的列表;它是一个加权值列表,其中每个值都可以具有一个质量值,该值用0和1之间的值指定偏好。这意味着仅仅因为出现一个特定值并不意味着该值是最优选的值。事实上,0的质量值意味着“根本不可接受”。

因此,不要只是查看是否存在某个特定的子字符串,而应该解析加权值列表并找到首选值与可用值之间的最佳匹配。

但mod_rewrite并不适合这份工作。您应该更好地使用像PHP这样的更强大的语言。

+0

感谢您的回答。 基本上,如果用户在其语言列表的开始处放置英语,那么我的.htaccess中的RewriteCond将会被释放,因此他将被重定向。 – 2010-08-06 16:15:53

+0

@Benjamin Netter:但在开始时使用'en'并不意味着英语是最受欢迎的语言。它可能具有1以外的质量值(可能甚至为0),并且可能有其他语言优于英语。那么,为什么你不用PHP来进行语言协商,你可以做的不仅仅是简单的字符串比较? – Gumbo 2010-08-06 16:26:35

+0

这不是我想要做的。 – 2010-08-06 16:47:26