使用PHP检测IE浏览器版本

时间:2010-07-10 18:12:28

标签: php internet-explorer-8 internet-explorer-7 browser

我正在使用$ _SERVER ['HTTP_USER_AGENT']来检测用户的浏览器。 当我在IE8上的localhost上运行var_dump时,它返回: ...兼容; MSIE 8.0; ... 但当我将它上传到我的主人(godaddy)时,我得到: ...兼容; MSIE 7.0; ...

有什么问题?

4 个答案:

答案 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];