【发布时间】:2015-09-15 10:22:10
【问题描述】:
我用 PHP 编写了一个小脚本,用于检查浏览器的语言设置并将它们重定向到网站的语言版本(WP 多站点),
function redirect() {
$language = substr( $_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2 );
switch( $language ) {
case 'sv':
header( 'Location: http://www.example.com/sv/' );
break;
case 'no':
header( 'Location: http://www.example.com/no/' );
break;
case 'da':
header( 'Location: http://www.example.com/da/' );
break;
default:
header( 'Location: http://www.example.com/' );
break;
}
}
if ( strlen($url) < 4 ) {
session_start();
if ( empty($_SESSION[ 'language' ]) ) {
$_SESSION[ 'language' ] = true;
redirect();
}
}
使用 Mobile Safari 或 Mobile Chrome 进行测试时,重定向似乎不起作用。我需要考虑移动浏览器的接受语言的任何特殊输出吗?
更新:经过更多调试后,我发现了这一点:
- Mobile Safari 在回显 HTTP_ACCEPT_LANGUAGE 但不重定向时显示正确的语言。
- 移动版 Chrome(仅限 iOS,适用于 Android)无法显示正确的语言(默认为“en”)。
- iOS 以不同的顺序解析 http 标头数据,比较 iOS Chrome (en-US,en;q=0.8,sv;q=0.6) 和 OSX Chrome (sv,en-US;q=0.8,en; q=0.6)。
【问题讨论】:
-
在您的移动设备上回显
HTTP_ACCEPT_LANGUAGE是否存在? -
抱歉,忘了提及 - 回显这给我“en”作为 Mobile Safar 和 Mobile Chrome (iOS 8) 的结果。
-
看来
HTTP_ACCEPT_LANGUAGE不能在移动设备上工作。当 UA 移动时,您可以询问用户他们的语言或尝试其他方法。 -
如果您“回显”您的
HTTP_ACCEPT_LANGUAGE值然后尝试重定向,它将不起作用,因为您已经将输出发送到浏览器。如果您不想通过虚假输出潜在地破坏应用程序逻辑,请使用适当的基于日志的调试技术。此外,除了浏览器发送的 Accept-Language 字符串为您提供的内容外,您真的无事可做。您的 iOS Chrome 示例应该导致en-US或en作为选择语言,因为sv具有较低的 q 值。他们在这里一点也不坏。您可能只是在这些设备上具有不同的本地化设置。 -
你能把$url的值贴出来,你为什么要检查它的长度是否小于4个字符?谢谢
标签: php redirect url-redirection http-accept-language