根据首选语言 (Accept-Language) 使用 .htaccess 进行重定向

根据首选语言 (Accept-Language) 使用 .htaccess 进行重定向

当用户请求时/,我希望将他们重定向到/en/de,具体取决于他们在 HTTP 请求标头中指定的偏好Accept-Language

我想这通过服务器端脚本很容易实现,但我需要一个.htaccess解决方案,因为它必须适用于静态站点。

我尝试过的:

用户可以选择自己喜欢的语言,他们不会被重定向。

  • mod_rewriteRewriteCond %{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 的警告,但由于延迟问题,我从未使用它。祝你好运!

相关内容