当用户请求时/
,我希望将他们重定向到/en
或/de
,具体取决于他们在 HTTP 请求标头中指定的偏好Accept-Language
。
我想这通过服务器端脚本很容易实现,但我需要一个.htaccess
解决方案,因为它必须适用于静态站点。
我尝试过的:
- mod_negotiation(使用类型映射或选项
MultiViews
):
用户可以选择自己喜欢的语言,但他们不会被重定向。
- mod_rewrite(
RewriteCond %{HTTP:Accept-Language}
):
用户被重定向,但他们(不一定)能得到自己喜欢的语言。
(‡ 它既不能保证该语言的质量值大于 0,也不能找到首选如果两种语言都指定了不同的质量值。)
有解决办法吗?
是否以某种方式进行内容协商重定向,或允许在RewriteCond
指令中检查/比较质量值,或者完全不同的事情。
答案1
一些想法:
如果您有权访问服务器配置,则可能有一种方法:使用重写映射您的服务器配置中的指令。
然后,您可以将Accept-Language
标头发送到 Perl 或任何脚本,该脚本将返回您可以在 RewriteRule 中使用 301 的首选语言。
如果您可以使用类似 的语言php
,则可以使用“ ”中的 index.php 文件,/
该文件将使用 函数发送重定向header('Location: /en/static-pages.html')
。从 php 5.3 开始,还有一个函数locale_accept_from_http()
,它从标头返回首选语言环境。
但重要的是:你希望用户"get their preferred language"
。你确定这种技术能让用户获得其首选语言吗?很多人没有在浏览器首选项中设置它。自动语言选择应该(必须?)与记住用户的选择(cookie)相结合,并且用户的选择应该(必须?)优先于自动选择。
答案2
免责声明: 我没有测试过这个。我以前对这种类型的逻辑使用过类似的东西,使用 mod_alias 设置变量并让 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]
我应该补充一点,这个例子使用的是 apache 配置,而不是 .htaccess。我记得 .htaccess 中有一些关于 mod_rewrite 的警告,但由于延迟问题,我从未使用它。祝你好运!