用 php 检测浏览器的最佳方法是啥?

Posted

技术标签:

【中文标题】用 php 检测浏览器的最佳方法是啥?【英文标题】:What's the best way to detect a browser with php?用 php 检测浏览器的最佳方法是什么? 【发布时间】:2011-06-16 16:41:00 【问题描述】:

谁能告诉我使用 php 检测浏览器的最佳方法? IE 6 和 7 在实现与 CSS 的完全浏览器兼容性方面非常糟糕,因此我的网站将不支持 8 之前的 IE 版本。

我目前正在使用$_SERVER['HTTP_USER_AGENT'] 来检测浏览器,但有人告诉我这不是一个好方法,因为浏览器可以撒谎并发送他们想要的任何用户代理信息。那么,有谁知道检测客户端使用的浏览器类型的可靠方法吗?

【问题讨论】:

你应该接受你的问题的答案。 嗯。我已经接受了以前问题的答案。你怎么知道我做了还是没做? 任何知道如何更改其用户代理的人都不会使用 IE6 或 7 哦,好吧。我以前接受过答案。我只是从未点击过那个空心支票。谢谢 【参考方案1】:

您无法可靠地检测浏览器是什么。就这么简单。

浏览器能够谎报自己的身份,而且经常这样做。

一些代理和安全产品会从请求中删除用户代理数据,因此您的 PHP 代码可能只会得到一个空字符串。

javascript 中你可能会更幸运,虽然它仍然存在问题,但在 PHP 级别你永远无法确定。

我的第一个建议是放弃对 IE6 的支持,除非您的受众群体是真正顽固的少数群体。现在,大多数发达国家的 IE6 使用统计数据已降至 2.5% 以下。仅此一项就可以解决大部分 CSS 问题。 IE7 仍然不是很好,但它比 IE6 好上一英里,而且在坚持现代标准的同时几乎可以支持。

我的第二个建议是,与其尝试为这些浏览器降级您的网站,不如尝试升级浏览器。

有许多非常好的技巧和工具可以让您改进旧版本 IE 中的 CSS 支持。我建议您尝试以下方法:

CSS3Pie Selectivizr Modernizr Dean Edwards' IE7.js

当然还有无处不在的JQuery。

【讨论】:

【参考方案2】:

用 PHP 检测用户浏览器的最佳方法是用 PHP 检查用户浏览器。

您已经提到 IE lt 8 不适合 CSS(这是每个 Web 开发人员都同意的),告诉用户他们的浏览器太旧的最好方法是在 html 中使用条件注释:

<head>
...
<!--[if IE lt 8]>
  <link rel="stylesheet" type="text/css" href="ie-styles.css" />
<![endif]-->
</head>
<body>
<!--[if IE lt 8]>
  <div id="ie-only">
    <p>Please get a <a href="http://www.abetterbrowser.org/">better browser</a>.</p>
  </div>
<![endif]-->
...
</body>

我编写的代码显示了您可以做的两件事:首先它显示您可以设置仅 IE 样式表,其次它显示您可以设置仅 IE 的 HTML 块。

我认为您没有理由不允许您的 IE 用户使用您的网站,如果它不起作用,请让他们知道使用蹩脚的浏览器是他们自己的错。

这也将允许您为后续 PHP 调用设置 cookie:

<!--[if IE lt 8]>
<script type="text/javascript">document.cookie='isie=oh-crud-you-use-ie';</script>
<![endif]-->

【讨论】:

如果只检测 IE 而不是特定版本呢?【参考方案3】:

愚蠢的回答提醒。

如果您只对检测 IE6 和 7 感兴趣,您可以创建一个中间页面:

<form action="wherever.php" method="post">
    <!--[if lt IE 8]>
    <input type="hidden" name="too_old" value="1" />
    <![endif]-->
</form>
<script>
document.getElementsByTagName('form')[0].submit();
</script>

这将是整个页面,原样。 (如果你愿意,你可以为没有启用 JS 的人添加一些东西。)

然后,当它转到下一页时,您可以拥有这个PHP:

$location = empty($_GET['too_old']) ? 'good_page.wherever' : 'bad_page.whatever';
header('Location: '.$location);

inb4 "但是有很多方法可以打破这一点。"

【讨论】:

【参考方案4】:

检测浏览器的最佳方法是使用下面给出的 php 类。 一年前我为我的网站创建了这个。它适用于 chrome、firefox、opera 和 Internet Explorer。

 <?php 
    class Browser  
        public static function detect()  
            $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']); 
            if ((substr($_SERVER['HTTP_USER_AGENT'],0,6)=="Opera/") || (strpos($userAgent,'opera')) != false ) 
                $name = 'opera';
             
            elseif ((strpos($userAgent,'chrome')) != false)  
                $name = 'chrome'; 
             
            elseif ((strpos($userAgent,'safari')) != false && (strpos($userAgent,'chrome')) == false && (strpos($userAgent,'chrome')) == false) 
                $name = 'safari'; 
             
            elseif (preg_match('/msie/', $userAgent))  
                $name = 'msie'; 
             
            elseif ((strpos($userAgent,'firefox')) != false)  
                $name = 'firefox'; 
             
            else  
                $name = 'unrecognized'; 
             
            if (preg_match('/.+(?:me|ox|it|ra|ie)[\/: ]([\d.]+)/', $userAgent, $matches) && $browser['name']=='safari' )  
                $version = $matches[1]; 
            
            if (preg_match('/.+(?:me|ox|it|on|ra|ie)[\/: ]([\d.]+)/', $userAgent, $matches) && $browser['name']!='safari' )  
                $version = $matches[1]; 
            
            else  
                $version = 'unknown'; 
             

            return array( 
                'name'      => $name, 
                'version'   => $version,
            ); 
         
     
    $browser = Browser::detect(); 
    echo 'You browser is '.$browser['name'].' version '.$browser['version']; 
    echo "<br />";
    ?> 

【讨论】:

【参考方案5】:

您只能使用 Javascript 可靠地检测浏览器用户代理。对于 PHP,您必须依赖 $_SERVER['HTTP_USER_AGENT'] 的内容。

【讨论】:

这是不正确的。你也可以欺骗你的 JavaScript 用户代理。 你的意思是像 navigator.appName 和 navigator.appVersion 这样的变量是可欺骗的? 用户代理是可欺骗的。其他 Javascript 方法更可靠(特别是一些依赖于特定浏览器功能和/或错误的方法),但除非绝对没有其他方法,否则我仍然不会使用它们。特征检测每次都胜过浏览器检测。 我同意。特征检测 > UA 检测。谢谢。

以上是关于用 php 检测浏览器的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

检测移动设备的最佳方法是啥?

使用 PHP 创建单文件上传表单的最佳方法是啥?

在 Drupal 中创建基于标准的、跨浏览器兼容的圆角的最佳方法是啥?

当发布新图像时,确保图像不会在客户端浏览器中兑现的最佳方法是啥?

处理缓存和浏览器后退按钮的最佳方法是啥?

用 PHP 衡量(和改进)性能的最佳方法是啥?