使用PHP进行可靠的用户浏览器检测

41

仅使用PHP检测用户的浏览器,$_SERVER['HTTP_USER_AGENT']是否可靠?我应该选择get_browser函数吗?你认为哪一个能够提供更精确的结果?

如果这种方法是切实可行的,那么将其用于输出相关的CSS链接是否不明智呢?

if(stripos($_SERVER['HTTP_USER_AGENT'],"mozilla")!==false)
   echo '<link type="text/css" href="mozilla.css" />';

我注意到了这个问题,但我想澄清一下这是否适用于基于CSS的检测。

更新: 有些可疑:我在IE 7上尝试了echo $_SERVER['HTTP_USER_AGENT'];,输出结果如下:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618)

Safari也给出了包含“mozilla”的奇怪结果。这是怎么回事?


“Mozilla/4.0”这一部分是出于遗留原因而存在的……即使在IE8中也是如此。 - scunliffe
IE自相当长的时间以来一直标识自己为Mozilla 4.0。我读过他们这样做是出于兼容性的原因,但现在找不到来源了。如果我必须猜测,我会说这是NetScape/IE时代的残留物。 - Bobby
“User-Agent” 不是很可靠,但这是猜测的唯一方法。 - Gumbo
3
好的,我会尽力进行翻译。@bobby http://webaim.org/blog/user-agent-string-history/ 这是一篇关于用户代理字符串历史的博客文章。 - Knu
在最新版本的Firefox上无问题运行。 - user198989
有许多(好的)浏览器检测工具可用。请尝试在此处列出的其中之一 https://github.com/ThaDafinser/UserAgentParser - ThaDafinser
11个回答

0

@Ekramul Hoque 的想法是正确的,但他的答案存在几个缺陷。

首先,我会从 Edge 开始,因为 Internet Explorer 在其UA中不包含术语 Edge

if(strpos($_SERVER['HTTP_USER_AGENT'], 'Edge') !== FALSE) {
  echo '<link type="text/css" href="ms.css" />';

然后,继续向后工作,因为早期版本的IE没有使用Trident引擎,因此在它们的UA中不会包含它。

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== FALSE) {
  echo '<link type="text/css" href="ms.css" />';
} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
  echo '<link type="text/css" href="ms.css" />';

我们需要接下来针对iOS浏览器,以便后续的查询不会干扰到这个查询。所有的iOS浏览器都使用webkit,除了Opera Mini,它通过远程服务器进行渲染而不是设备本身。这意味着我们可以通过UA中的iOS来针对该操作系统,并排除包含Opera的UA。
} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'iOS') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') !== FALSE {
  echo '<link type="text/css" href="webkit.css" />';

接下来,转向Firefox浏览器。虽然使用Firefox作为搜索词可以起到作用,但它只能识别Firefox浏览器,而不能识别基于Firefox的浏览器。Firefox在其UA中包含Gecko,因为Gecko是它使用的引擎,因此我们可以针对它进行定位。通过使用Gecko,我们可以识别所有运行在Gecko引擎上的浏览器(例如SeaMonkey)。然而,许多浏览器出于兼容性原因使用术语“like Gecko”,因此我们必须确保匹配的是“Gecko”,而不是“like Gecko”。
} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Gecko') && !strpos($_SERVER['HTTP_USER_AGENT'], 'like Gecko') !== FALSE) {
  echo '<link type="text/css" href="moz.css" />';

接下来我们将识别Opera浏览器。Opera在v12版本之前使用了Presto引擎。从v15开始,他们开始像Chrome一样使用Blink引擎。v12及更早版本的UA中包含两个独特的单词,而v15+没有--OperaPresto。您可以针对其中任何一个进行定位,因为它们总是同时存在。对于v15,Opera开始在UA中使用OPR

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Presto') !== FALSE) {
  echo '<link type="text/css" href="o.css" />';
} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'OPR') !== FALSE) {
  echo '<link type="text/css" href="normal.css" />';

接下来是Safari。Safari使用AppleWebKit作为其渲染引擎,但我们不能只针对它,因为Chrome也为了兼容性而在其UA中包含了AppleWebKit和Safari。因此,我们需要搜索AppleWebKit而不是Chrome。
} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'AppleWebKit') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== FALSE) {
  echo '<link type="text/css" href="webkit.css" />';

最后,我们来到了Chrome。Chrome在v27之前使用AppleWebKit。随着v28的发布,他们转向了Blink引擎。我们可以针对这两个引擎进行目标定位,但这需要大量的代码。考虑到Chrome现在已经接近v70,我们只需搜索Chrome,因为几乎没有人仍在运行Chrome的webkit版本。
} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== FALSE {
  echo '<link type="text/css" href="normal.css" />';

最后但同样重要的是,你的备用/否则。
} else {
  echo '<link type="text/css" href="normal.css" />';
}

现在,我使用了css文件来引用供应商前缀以实现定位的效果。根据需要随意调整,使其按照您的要求完成相应任务。希望这对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接