我能用PHP检测IE6吗?

48

有没有一种方法可以使用PHP来检测页面是否在IE6中加载?


你为什么想要这样做? - staticsan
4
哈哈,让我们消灭IE6吧!http://www.bringdownie6.com/ - lock
19
由于老旧且开发耗时,有时您只想将用户重定向到糟糕且老式的网站版本。 - Ryan Florence
我想在我的网站上添加一条消息,告诉IE6用户更新他们的浏览器。 - ddonche
17个回答

64

尝试检查他们的用户代理是否为'MSIE 6.'

$using_ie6 = (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') !== FALSE);

这是基于此用户代理信息的。


8
这通常也适用于Opera,因为Opera通常在其用户代理字符串中添加“MSIE 6.0”。 - thomasrutter
3
最近版本的 Opera 默认情况下不包含 MSIE 6.0 在用户代理字符串中。 - philfreo
2
在我的情况下,对于所有 MSIE 浏览器来说,这是虚假阳性,因为它们全部列出了“MSIE 6.0 兼容”,即使它们的版本实际上更高。 - Christian
2
@thomasrutter - 只需在您的 if 条件中添加 && !strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') 即可。 - Tom

28

2
这可能有时会有用,但实际上并不是问题的答案。它询问如何使用PHP进行操作。用户代理可能是IE,但它可能不会呈现HTML。 - Darth Egregious

15

这个页面上基于用户代理的许多答案并不太可靠,因为Opera经常使用包含"MSIE 6.0"的用户代理字符串来标识自己,例如:

Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 9.51

这影响 Opera 5 到 9 的所有版本,甚至还包括 Opera 10,并且可以在 Opera 中打开或关闭。请参见此页面

我经常看到的一种常见方法是测试是否为“MSIE”,并排除“Opera”。例如:

if (preg_match('/\bmsie 6/i', $ua) && !preg_match('/\bopera/i', $ua))
  echo "We have IE6!";

2
$ua = $_SERVER['HTTP_USER_AGENT'];如果匹配'/\bmsie [56]./i'并且不匹配'/\b(opera|msie [789])/i',则输出“IE 5或6”。 - andrem
3
这里使用 strpos() 函数会更快地完成任务。 - Dunhamzzz

12

嗯,PHLAK...

我认为这个更好 :P

  if(preg_match('/msie [2-6]/i',$_SERVER['HTTP_USER_AGENT'])) {
   // if IE<=6
  } else {
   //if IE>6
  }

工作得很好,除了“preg”应该是“preg_match”。 - kingjeffrey
语法'/msie [1-6]/i'更短,对大多数人来说可能更为熟悉。 - Gras Double
是的,你说得对 :) 但那是3年前的事了,现在我的正则表达式技能比当时好多了 ;) - marverix
1
请注意,此方法将错误地将IE10识别为匹配项。 - technoTarek
//if IE>6的注释是误导性的。任何其他浏览器都将匹配失败。 - designosis
这就是为什么它被列在else语句中的原因,neokio。 - ddonche

9

听起来很有趣,我会试一试。 - PHLAK

6

就像其他人所说,仅通过检查用户代理可能会有误报...因此为什么不同时使用用户代理检查和条件注释呢。

例如...

<? if (preg_match('/\bmsie 6/i', $_SERVER['HTTP_USER_AGENT']) { ?>
  <!--[if IE 6]>
    // ie6 only stuff here
  <![endif]-->
<? } ?>

这样做可以避免将这些不必要的代码发送回大多数浏览器...但在出现误报的情况下仍然是安全的。

3
您可以使用HTTP User-Agent头来进行浏览器识别,但我强烈建议如果可能的话不要这样做。User-Agent头非常难以准确解析,并倾向于通过简单的字符串匹配产生误报 - 甚至忽略了伪装成其他浏览器的浏览器的问题。例如,Jeremy的“MSIE 6.”字符串将匹配IE Mobile,这与IE6非常不同,通常您不希望将它们混为一谈。
此外,当您向不同的浏览器发送不同的HTML时,必须使用“Vary”头(这使缓存效果降低)以避免缓存向不同的浏览器发送错误的页面。
因此,如果您可以找到另一个地方来执行浏览器区分,那肯定是最好的。Ólafur的条件注释方法通常是更改JavaScript和HTML标记/CSS链接的最简单方法。

2

您可以在许多浏览器中使用它,但这需要耗费时间,并且有时会出现误报...

function do_stylesheet_link() {
// Picks up appropriate css file depending on the user-agent

//  if ( stristr($_SERVER['HTTP_USER_AGENT'], 'Firefox') ) {
//echo '<link rel="stylesheet" href="css/firefox.css" type="text/css" />'; }    

//elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'Chrome') ) {
//echo '<link rel="stylesheet" href="css/chrome.css" type="text/css" />'; }

//elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'Safari') ) {
//echo '<link rel="stylesheet" href="css/safari.css" type="text/css" />'; }

//elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'Opera') ) {
//echo '<link rel="stylesheet" href="css/opera.css" type="text/css" />'; }

    if ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') )  {
echo '<link rel="stylesheet" href="css/ie6.css" type="text/css" />'; }

elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 7.') ) {
echo '<link rel="stylesheet" href="css/ie7.css" type="text/css" />'; }

elseif ( stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE 8.') ) {
echo '<link rel="stylesheet" href="css/ie8.css" type="text/css" />'; }

else {
echo '<link rel="stylesheet" href="css/style.css" type="text/css" />';
}

}


2

if(substr($_SERVER['HTTP_USER_AGENT'],0,34)=="Mozilla/4.0 (compatible; MSIE 6.0;") echo "我是愚蠢的IE6";

IE6用户代理总是以"Mozilla/4.0 (compatible; MSIE 6.0;"开头,而IE7、8则在中间含有"MSIE 6"。


1

列出的方法通常会标记带有某些插件(例如MathPlayer以及一些恶意工具栏)的浏览器。

我发现一个更可靠的方法是:

if( preg_match('/^Mozilla\/4\.0 \(compatible; MSIE 6/', $_SERVER['HTTP_USER_AGENT']) != 0 )

如果在if语句中检测到IE6,则代码片段将返回TRUE。 - AJ-D

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