我正在使用$ _SERVER ['HTTP_USER_AGENT']来检测用户的浏览器。 当我在IE8上的localhost上运行var_dump时,它返回: ...兼容; MSIE 8.0; ... 但当我将它上传到我的主人(godaddy)时,我得到: ...兼容; MSIE 7.0; ...
有什么问题?
答案 0 :(得分:9)
是的,那就是问题所在。不要那样做。我正在使用$ _SERVER ['HTTP_USER_AGENT']来检测用户的浏览器
User-Agent
字符串黑客是一场失败的比赛。有许多奇怪的案例可能会使您的脚本混淆。
这是其中之一:IE8,当默认为兼容模式时,假装是IE7。您可以通过字符串中Trident/...
的存在来检测此情况,但当然像所有字符串黑客'解决方案'一样,如果该字符串恰好出于其他原因而出现,那么它可能会出错任何应用程序都可以将任意字符串粘贴到IE的User-Agent标头的末尾,并且确实考虑到浏览器经常说谎他们是谁,中间人可能会更改或删除标题。
此外,通过在服务器端进行浏览器嗅探,您的HTTP响应取决于浏览器查看它们,这意味着代理缓存将错误的页面提供给错误的浏览器,除非您包含正确的{{1标头。但如果你这样做,你就会在IE中打破缓存。
服务器端UA嗅探是一种恐怖,如果真的不可能使用任何其他技术,你应该只使用它作为最后的手段。对于向特定版本的IE显示不同内容的通常情况,使用条件注释会更好。
答案 1 :(得分:2)
检查字符串中的单词TRIDENT
。兼容性是在兼容模式下。谷歌,如果你想知道这意味着什么。但是,三叉戟这个词只是ie8 +。
编辑: 此外,您可以设置headder / meta-tag以强制ie8模式(不兼容)。但是,这可能不会在第二个请求之前生效。谷歌也是。
答案 2 :(得分:1)
尝试get_browser()
,看看会发生什么。
从链接:
<?php
echo $_SERVER['HTTP_USER_AGENT'] . "\n\n";
$browser = get_browser(null, true);
print_r($browser);
?>
输出:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3
Array
(
[browser_name_regex] => ^mozilla/5\.0 (windows; .; windows nt 5\.1; .*rv:.*) gecko/.* firefox/0\.9.*$
[browser_name_pattern] => Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:*) Gecko/* Firefox/0.9*
[parent] => Firefox 0.9
[platform] => WinXP
[browser] => Firefox
// ...
答案 3 :(得分:-1)
preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $matches);
echo $version = $matches[1];