2011-01-27 78 views
3

任何人都可以告诉我使用php检测浏览器的最佳方法吗? IE 6和7在实现浏览器与CSS的完全兼容性方面非常糟糕,所以我的网站不支持和8以上的IE版本。用php检测浏览器的最佳方法是什么?

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

+8

你应该接受你的问题的答案。 – SLaks 2011-01-27 16:49:05

+0

嗯。我已经接受了以前的问题的答案。你怎么知道我是否做到了? – Lance 2011-01-27 16:51:24

+0

任何知道如何更改用户代理的人都不会使用IE6或7 – Ross 2011-01-27 16:53:37

回答

4

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

浏览器能够说谎他们的身份,并经常这样做。

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

在Javascript中,您可能会有更多运气,尽管它仍然存在问题,但在PHP级别,您永远无法确定。

我的第一个建议是放弃对IE6的支持,除非你的人口是真正的少数族裔。现在大多数发达国家的IE6使用统计降至2.5%以下。仅此一项就可以摆脱大部分CSS问题。 IE7仍然不太好,但它比IE6更加明显,而且它坚持现代标准的同时也是可以支持的。

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

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

和当然,无处不在的JQuery

-1

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

0

傻回答警报

如果你只在检测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“但有很多方法可以打破这一点。“

1

用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用户不能使用你的wobsite,如果它不工作,只是让他们知道这是他们自己的错误使用一个不起眼的浏览器。

这也将让你设置一个cookie后续PHP呼叫:

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

来检测浏览器的最好方法是使用下面给出的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 />"; 
    ?> 
相关问题