当用户请求/ ,我想redirect到/en或/de ,这取决于他们在HTTP请求头Accept-Language指定的首选项。
我想这是服务器端脚本很容易,但我需要一个.htaccess解决scheme,因为它必须为静态网站工作。
我试过的:
mod_negotiation (使用types映射或MultiViews选项):
用户获得他们的首选语言, 但他们不会被redirect。
mod_rewrite ( RewriteCond %{HTTP:Accept-Language} ):
用户被redirect, 但他们不(必须)获得他们的首选语言。
(‡也不保证语言的质量值大于0,也不会在两种语言用不同的质量值指定的情况下find首选的语言。)
有这个解决scheme吗?
不pipe是以某种方式使内容协商redirect,还是允许在RewriteCond指令中检查/比较质量值,或者完全不同的东西。
一些想法:
如果您有权访问服务器configuration,可能有一种方法:在您的服务器configuration中使用RewriteMap指令。
然后,您可以将Accept-Language头文件发送到Perl或其他任何脚本,这些脚本将以301的forms发回可以在您的RewriteRule中使用的首选语言。
如果您有权访问php语言,则可以使用“ / ”中的index.php文件发送带有函数header('Location: /en/static-pages.html')的redirect。 从PHP 5.3还有一个函数locale_accept_from_http() ,它locale_accept_from_http()返回首选的语言环境。
但重要的是:您希望用户"get their preferred language" 。 你确定这个技巧能让用户得到它的首选语言吗? 所以很多人不会在他们的浏览器偏好中设置它。 自动语言select应该(必须)与用户select的记忆(cookie)相结合,用户的select应该(必须)优先于自动select。
免责声明:我没有testing过这个。 我在过去使用类似于这种types的逻辑,使用mod_alias来设置variables,并让mod_rewrite处理多个条件。 在Apache 2.4中使用If语句变得更容易。
RewriteEngine On SetEnvIf Request_URI ^/$ toplevel SetEnvIf Accept-Language 'fr' lang_french RewriteCond %{ENV:toplevel} 1 RewriteCond %{ENV:lang_french} 1 RewriteRule ^ /fr [R=302,L]
我应该补充说这个例子是使用apacheconfiguration而不是.htaccess。 我记得在.htaccess中有一些关于mod_rewrite的警告,但是由于延迟惩罚,我从不使用它。 祝你好运!