仅使用PHP检测IE兼容模式

时间:2013-07-30 08:43:55

标签: php internet-explorer-10

是否可以从使用者与PHP 检测到IE处于兼容模式?

我使用IE10并拥有useragent

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)

因此它显示为Internet Explorer 7。

当然,仅依靠PHP的这种检测是一个坏主意,但它对某些情况非常有用(例如使用PHP或调试提示进行日志记录,......)

2 个答案:

答案 0 :(得分:5)

从此资源:http://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx

要在兼容模式而不是常规IE 7中检测IE 10,您应该查看标识IE 10的令牌Trident/6.0,无论模式如何。

要从PHP检测它,请从标头中抓取用户代理并解析它以获取Trident/6.0字符串标记。

您可以从Trident令牌识别更多版本的Internet Explorer:IE9具有Trident/5.0,IE 8具有Trident/4.0,IE 7在其用户代理中没有Trident。

可以在$_SERVER['HTTP_USER_AGENT']找到用户代理字符串。从那里搜索内部子字符串或使用正则表达式是非常简单的。

IE10用户代理参考:

  • 普通模式:Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)
  • 兼容模式:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Trident/6.0)

请注意,MSIE令牌不同,但Trident令牌是相同的。这表示用户已启用兼容模式。

答案 1 :(得分:2)

不,不是。

首先,compat模式的重点在于它假装是指定了旧版本的IE。默认情况下,UA字符串会更改为其中一部分,并且与正在模拟的旧IE版本的真实副本提供的UA字符串相同

其次浏览器模式(即呈现模式)和文档模式(即用户代理)可以在开发工具中单独设置;它可能处于IE8 compat模式,但仍然显示IE10用户代理。

简而言之,尝试使用UA字符串检测compat模式是一个坏主意;它根本不可能,即使有可能,它也很容易被欺骗。

但是,您实际上不应该有正当理由这样做。如果您的站点告诉IE将页面显示为compat模式,那么服务器应该已经知道了;它不应该检查。有一些边缘情况会出现意外情况,但您可以使用X-UA-Compatible元标记解决这些问题。

最佳做法是尽可能避免竞争模式;如果你已经正确地编写了你的​​网站,那么compat模式应该是完全没必要的。如果您确实发现自己需要它,那么最好修复代码以便在IE10中正常工作。