用 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 检测浏览器的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 Drupal 中创建基于标准的、跨浏览器兼容的圆角的最佳方法是啥?