Intranet 站点的 IE9 兼容模式具有错误的用户代理字符串

Posted

技术标签:

【中文标题】Intranet 站点的 IE9 兼容模式具有错误的用户代理字符串【英文标题】:IE9 Compatability Mode for intranet sites has the wrong User-Agent String 【发布时间】:2012-12-01 15:10:53 【问题描述】:

我在一个大项目中工作,我们必须确定用户是否在 IE 中使用兼容性视图。 我正在使用此代码来执行此操作。

var agentStr = navigator.userAgent;
var mode = null;
if (agentStr.indexOf("Trident/5.0") > -1) 
    if (agentStr.indexOf("MSIE 7.0") > -1)
        mode = "IE9CV";
    else
        mode = "IE9";
 else if (agentStr.indexOf("Trident/4.0") > -1) 
    if (agentStr.indexOf("MSIE 7.0") > -1)
        mode = "IE8CV";
    else
        mode = "IE8";
 else
    mode = "IE7";

效果很好,问题是: 1 - 在 INTRANET 环境中,在客户端的浏览器中选中了“在兼容性视图中显示 Intranet 站点”选项,对此我无能为力

2 - 脚本检测兼容性视图不会有问题,但我不知道为什么,如果页面在 IE 9 上加载,我收到的用户代理是下面的这个 兼容性视图

Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)

与使用 IE9

加载的页面非常相同
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)

虽然我会收到

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

用于 IE9 兼容性视图。 当我强制 IE9 兼容性视图(如预期的那样)时,我得到了最后一个结果,但是当它自行加载时,我得到的用户代理与 IE9 标准发送给我的用户代理相同。所以我无法确定用户是否具有 IE9 标准视图或兼容性视图。

我不知道我是否说清楚了,但它看起来像一个大的 IE 错误。 我应该如何进行?有没有人也遇到过这个问题?

这是模拟情况的屏幕:

【问题讨论】:

很奇怪...您确定它实际上是在兼容模式下显示它并选中了“显示 Intranet 站点”吗?因为你是对的,所以它应该为 IE9 Comp Mode 显示 MSIE 7.0; Trident/5.0;。只是询问,因为如果 UAgent 正在显示它,那么它实际上可能并不处于 Comp 模式。 mcpDESIGNS 检查我上次的编辑...我添加了一个模拟情况的图像,以及我得到的响应 =/ @Christoph 这不是重复的,而是一个不同的问题。我最近一直在处理兼容性问题,我什至不知道这个问题。您是否尝试过联系 Microsoft 以查看他们是否对这个奇怪的 Intranet 复选框问题有任何建议?我觉得除非 UAString 是正确的,否则我不知道你怎么知道它是否真的处于兼容模式 恐怕版主根本没有阅读整篇文章,甚至没有尝试理解它。每当人们这样做时,社区就会失去知识和共同解决问题的能力。 这不是重复的。我会尝试重新打开它rafaces。我什至改了标题。运气好能搞清楚吗?我一直在找,也没找到! 【参考方案1】:

兼容模式几乎无处不在! :)

但是,尽量不要检测浏览器代理,因为它很容易被欺骗并且通常不可靠,而是尝试“特征检测”。

您可以使用一些库来执行此操作

Modernizr hasjs

编辑:如果您的要求是阻止用户访问启用了兼容性视图的站点,您可以使用<META> tag / HTTP header. 禁用该模式。请参阅此处了解更多信息。

http://blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx

http://blogs.msdn.com/b/ie/archive/2008/06/10/introducing-ie-emulateie7.aspx

【讨论】:

我知道你的意思,这将是一个完美的解决方案,但是检测兼容模式和如果用户启用了兼容性视图,则阻止访问。 我已经在使用标签将浏览器设置为IE9: 问题是兼容性视图设置(在 Intranet 上)覆盖了浏览器模式的行为。 外部用户会按预期行事,但内部(内部网)客户端会进入启用兼容性视图的页面,即使我使用元标记。 好的,不想大讨论,因为我自己从未尝试过,但我发送的链接显示 标签/标题的存在表明该站点已更新为支持 IE8,其价值“胜过”客户端上的兼容性视图会导致的任何模式。T 你是对的 BuddhiP,我也有一些文件说...ie.microsoft.com/testdrive/ieblog/2010/Jun/… 但似乎 IE 的行为与它应该的相反(感谢 Microsoft)。当我取消选中“在兼容性视图中显示 Intranet 站点”时,它们遵循 META 标记并按预期运行,但看起来兼容性视图设置会覆盖 META 标记 =/

以上是关于Intranet 站点的 IE9 兼容模式具有错误的用户代理字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何从服务器端强制关闭 IE 兼容模式?

如何从服务器端强制设置IE的兼容模式?

强制关闭 IE 的兼容模式

Internet Explorer 11 通过元标记禁用“在兼容性视图中显示 Intranet 站点”不起作用

兼容模式下ie9和ie10显示样式在不兼容模式下为啥不加载css样式?

Internet Explorer 将 Meteor.js 应用程序识别为 Intranet 站点。不会加载