仅使用PHP检测IE兼容模式

仅使用PHP检测IE兼容模式,php,internet-explorer-10,Php,Internet Explorer 10,是否可以从useragent和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) 所以它看起来像是InternetExp

是否可以从useragent和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)
所以它看起来像是InternetExplorer7

当然,只依靠PHP进行这样的检测是一个坏主意,但对于某些地方(例如使用PHP登录或调试提示等)来说,这非常有用。

来自以下资源:

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

要从PHP中检测它,请从标题中抓取用户代理,并将其解析为
Trident/6.0
string标记

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

用户代理字符串可以在
$\u服务器['HTTP\u user\u agent']
上找到。从这里开始,搜索内部或使用正则表达式的子字符串就很简单了

IE10用户代理参考:

  • 正常模式:
    Mozilla/5.0(兼容;MSIE 10.0;Windows NT 6.2;Trident/6.0)
  • 兼容模式:
    Mozilla/4.0(兼容;MSIE 7.0;Windows NT 6.2;Trident/6.0)
请注意,MSIE令牌不同,但Trident令牌相同。这表示用户已启用兼容模式。

来自此资源:

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

要从PHP中检测它,请从标题中抓取用户代理,并将其解析为
Trident/6.0
string标记

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

用户代理字符串可以在
$\u服务器['HTTP\u user\u agent']
上找到。从这里开始,搜索内部或使用正则表达式的子字符串就很简单了

IE10用户代理参考:

  • 正常模式:
    Mozilla/5.0(兼容;MSIE 10.0;Windows NT 6.2;Trident/6.0)
  • 兼容模式:
    Mozilla/4.0(兼容;MSIE 7.0;Windows NT 6.2;Trident/6.0)
请注意,MSIE令牌不同,但Trident令牌相同。这表示用户启用了兼容模式。

不,不是

首先,compat模式的全部要点是它假装是IE的旧版本。默认情况下,UA字符串作为该字符串的一部分进行了更改,它与模拟的旧IE版本的真实副本提供的UA字符串相同

其次,浏览器模式(即呈现模式)和文档模式(即用户代理)可以在开发工具中分别设置;可以处于IE8兼容模式,但仍显示IE10用户代理

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

然而,你永远不应该有一个有效的理由来实际需要这样做。如果你的站点告诉IE以兼容模式显示页面,那么服务器应该已经知道了这一点;不需要检查。有一些边缘情况可能会意外出现,但您可以使用
X-UA-Compatible
meta标记解决这些问题

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

不,它不是

首先,compat模式的全部要点是它假装是IE的旧版本。默认情况下,UA字符串作为该字符串的一部分进行了更改,它与模拟的旧IE版本的真实副本提供的UA字符串相同

其次,浏览器模式(即呈现模式)和文档模式(即用户代理)可以在开发工具中分别设置;可以处于IE8兼容模式,但仍显示IE10用户代理

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

然而,你永远不应该有一个有效的理由来实际需要这样做。如果你的站点告诉IE以兼容模式显示页面,那么服务器应该已经知道了这一点;不需要检查。有一些边缘情况可能会意外出现,但您可以使用
X-UA-Compatible
meta标记解决这些问题


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

这个答案很有帮助,但它没有显示如何使用php检测它
Trident/6.0
意味着IE10。我不知道如何从那里获得兼容性模式,但我严重怀疑您是否应该为此进行开发。用户代理字符串无论如何都是不可靠的,您的服务器端代码通常不应该被这样的决策所困扰。这可能很有趣:如果您是来寻求帮助的,您还应该准备好接受这样一个事实,即您想要做的并不是解决任何问题的好方法@GolezTrol的评论是针对主题的。这个答案很有帮助,但它没有说明如何使用php来检测它
Trident/6.0
意味着IE 10。我不知道如何从那里获得兼容性模式,但我严重怀疑您是否应该为此进行开发。用户代理字符串不可靠