覆盖内网兼容模式 IE8
Posted
技术标签:
【中文标题】覆盖内网兼容模式 IE8【英文标题】:Override intranet compatibility mode IE8 【发布时间】:2011-01-31 20:58:33 【问题描述】:默认情况下,IE8 强制 Intranet 网站进入兼容模式。我尝试将元标头更改为 IE8,但它不承认元标头,只使用浏览器设置。有谁知道如何禁用此功能?
【问题讨论】:
试试***.com/questions/2742853/…,这对我有用。 在你的页面头标签中添加这个:(定位你想要的IE版本)。请注意,这不会改变浏览器说它处于兼容模式(称为浏览器模式)的事实,但页面将以 IE8 标准模式呈现。如果您检查 IE8 或更高版本,您将需要更改 javascript 以检查“三叉戟”。见:blogs.msdn.com/b/mikeormond/archive/2008/09/25/… @n00b - 这对我的网站没有影响。 我的理解是meta标签必须紧跟在head标签之后。我注意到一些脚本会在索引 0 处插入 head;因此,元标记将不再位于 head 之后。 【参考方案1】:可以覆盖 Intranet 中的兼容模式。
对于 IIS,只需将以下代码添加到 web.config。使用 IE9 为我工作。
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
<add name="X-UA-Compatible" value="IE=edge" />
</customHeaders>
</httpProtocol>
</system.webServer>
等效于 Apache:
Header set X-UA-Compatible: IE=Edge
对于 nginx:
add_header "X-UA-Compatible" "IE=Edge";
对于 express.js:
res.set('X-UA-Compatible', 'IE=Edge')
【讨论】:
这是正确答案。元标记没有任何作用,但添加响应标头有效。更多信息:social.msdn.microsoft.com/Forums/is/iewebdevelopment/thread/… 同意。这应该是正确答案,因为它仅正确覆盖了本网站的 Intranet 设置。 (澄清:它适用于文档模式,但不适用于浏览器模式) 这不是正确的答案。这个答案改变了文档模式,它不会改变重要的“浏览器模式”。我仍在寻找解决该问题的方法。 这不是正确的答案,因为它是特定于 .net 的(甚至不承认这一事实)。【参考方案2】:Michael Irigoyen 是正确的,但它有点复杂......
如果您使用的是 Paul Irish 的精彩样板,那么您将获得如下内容:-
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
如果您选中了“在兼容性视图中显示 Intranet 站点”,这将无法按预期工作并强制 IE 在 Intranet 环境中进入兼容模式。需要去掉条件IE cmets来阻止内网兼容模式。
所以下面的代码可以工作:
<!doctype html>
<html class="no-js" lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
基本上,如果您在<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
语句之前触发条件IE cmets,那么如果您使用默认设置运行IE9,您将被强制进入Intranet 环境中的兼容模式。
更新 - 附加信息: 但请注意,有一个技巧可以使 HTML5 样板工作:
在 DOCTYPE之前添加一个空的条件注释。还要注意,当您执行that 时,您可以也在X-UA-Compatible
指令周围添加条件 cmets,从而使页面也成为 HTML5 有效的。比如:
<!--[if HTML5]><![endif]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<![endif]-->
blog post that was inspired by the first part of this answer,有更多细节。 顺便说一句:正如那篇博文中提到的,还可以将 DOCTYPE 之前的条件评论替换为 半条件 评论 无条件:<!--[]-->
。因此,就像这样:
<!--[]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<![endif]-->
但请注意,后一种变体 (<--[]--><!DOCTYPE html>
) 将如 this answer to another question 所解释的那样激活众所周知的问题——对于不支持 X-UA-Compatioble
的旧版 IE 版本(阅读:对于 IE7 和 IE6 ) — 使浏览器进入 quirks-mode。
【讨论】:
这并没有解决我的问题。但是,仅供参考,将“X-UA-Compatible”添加为 Header DID 解决了问题!【参考方案3】:如果您下拉“工具”菜单并选择“兼容性视图设置”,则在底部的对话框中设置“以兼容模式显示 Intranet 站点”。如果您取消选中此项应该可以解决问题,并且 IE 将使用基于 DOCTYPE 的模式。
【讨论】:
我没有投反对票,但我猜这是因为您从用户的角度回答(用户应该做什么)。这个问题来自一位网络开发人员,询问如何在不要求用户执行任何特定操作的情况下解决问题。 此外,这不允许保持与旧应用程序的兼容性。如果您取消选中该设置,您的旧应用程序可能会因无法更新而中断。我认为提问者正在寻找一种方法来强制标准模式,当他们的 Intranet 上的所有其他应用程序都需要检查复选框的兼容性模式时。 我相信他确实从程序员的角度回答了这个问题。 “...IE 将使用基于 DOCTYPE 的模式”。请参阅:msdn.microsoft.com/en-us/library/ms535242%28VS.85%29.aspx 如果公司正在运行 Active Directory,管理员可以传播对浏览器设置的更改。使用 FireFox 无法做到这一点! @AndrewLewis 也许。但是,URL 栏中有一个兼容模式按钮,可以将浏览器设置为对该特定站点使用兼容模式。或者您可以在对话框中手动添加它们。再一次,这些事情可以由 IT 在全球范围内完成。 @PilotBob 如果您有 120K+ 用户和数百(如果没有数千)Intranet 站点需要支持,这不是一个可行的解决方案。【参考方案4】:这个问题的答案有些混乱。
目前的最佳答案是服务器端解决方案,它在 http 标头中设置了一个标志,并且一些 cmets 表明使用元标记的解决方案不起作用。
我认为这篇博客文章很好地概述了如何使用兼容性元信息,并且根据我的经验,其工作方式如下所述: http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x-ua-compatible-to-create-durable-enterprise-web-applications.aspx
要点:
使用元标记和在标题中设置信息都有效 元标记优先于标题 meta标签必须是第一个标签,以确保浏览器之前不会根据启发式确定渲染引擎重要的一点(我认为这一点引起了很多混乱)是 IE 有两个“类”模式:
-
文档模式
浏览器模式
文档模式决定渲染引擎(网页如何渲染)。
浏览器模式决定了 IE 向服务器发送的用户代理 (UA) 字符串、IE 默认的文档模式以及 IE 如何评估条件注释。
有关文档模式与浏览器模式的更多信息可以在这篇文章中找到:http://blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compatibility-features-for-site-developers.aspx?Redirected=true
根据我的经验,兼容性元数据只会影响文档模式。因此,如果您依赖浏览器检测,这将无济于事。但是,如果您使用的是特征检测,这应该是可行的方法。
所以我建议使用以下语法使用元标记(在 html 页面中):
<meta http-equiv="X-UA-Compatible" content="IE=9,10" ></meta>
注意:列出您测试过的浏览器模式。
博客文章还建议不要使用 EmulateIEX。这里引用:
话虽如此,我确实觉得奇怪的一件事是当一个应用程序 请求 EmulateIE7 或 EmulateIE8。这些仿真模式本身就是 决定。所以,与其具体说明你想要什么,不如说你是 要求两件事中的一件,然后确定这两件事中的哪一件 通过在代码中的其他地方查找 DOCTYPE(然后 试图了解 DOCTYPE 是否会给你标准 或怪癖取决于其内容 - 另一个有时令人困惑 任务)。与其那样做,我认为这更有意义 直接指定你想要什么,而不是给出一个回应 本身就是一个问题。如果你想要 IE7 标准,那么使用 IE=7,而不是 比 IE=EmulateIE7。 (请注意,这并不意味着您不应该使用 DOCTYPE——你应该这样做。)
【讨论】:
如何更改浏览器模式? 浏览器模式语句混乱 @JusticeFist 是的,你是对的,谢谢。我试图改进它。 @VishnudevK 我知道的唯一方法是使用开发人员工具。但您可能需要一个程序化解决方案。【参考方案5】:试试这个元标记:
<meta http-equiv="X-UA-Compatible" content="IE=8" />
即使选中“在兼容性视图中显示 Intranet 站点”,它也应该强制 IE8 呈现为 IE8 标准模式[对于 Intranet 或所有网站],我在 IE 8.0.6 上自己尝试过
【讨论】:
这实际上是正确的,但它必须出现在页面上的任何和所有 META 标记之前,否则它将不起作用。 这对我不起作用。据我所知,IE8“以兼容模式显示 Intranet 站点”是不可覆盖的 (澄清一下:它适用于文档模式,但不适用于浏览器模式。所以渲染是固定的,但浏览器仍然伪装成IE7)【参考方案6】:我们的系统管理员通过取消选中我们组织的全局复选框解决了这个问题。用户甚至不需要注销。
【讨论】:
如果 Intranet 上的所有站点都可以使用最新的 Web 标准,则此解决方案可以完美运行。但是,如果有些人不能,那么这种方法会无意中破坏那些......我会谨慎对待。【参考方案7】:我找到了一个有效的答案,允许覆盖选中的 Intranet 兼容性视图。 只需在页面的 OnInit 事件中添加这一行(不需要 meta 或 web.config customHeader):
Response.AddHeader("X-UA-Compatible", "IE=EmulateIE8");
【讨论】:
开发平台特定的答案......甚至没有指定平台。我猜你在谈论 Visual Studio .NET?据我所知,“OnInit”事件不存在(在 Javascript、Java、php 中......)【参考方案8】:尝试将以下内容放在标题中:
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
感谢 Paul Irish's HTML5 Boilerplate(但它也适用于 XHTML Transitional)。
【讨论】:
【参考方案9】:我能够通过在 head 部分将元标记指定为 THE FIRST TAG 来覆盖兼容模式,而不仅仅是第一个元标记,而且仅作为 VERY FIRST TAG。
感谢@stefan.s 在您出色的回答中让我参与其中。在阅读之前,我有:
这不起作用
<head>
<link rel="stylesheet" type="text/css" href="/qmuat/plugins/editors/jckeditor/typography/typography.php"/>
<meta http-equiv="x-ua-compatible" content="IE=9" >
将链接标签移开,它起作用了
这可行:
<head><meta http-equiv="x-ua-compatible" content="IE=9" >
因此,设置为使用兼容性的 IE8 客户端会将页面呈现为 IE8 标准模式 - content='IE=9' 表示使用最高可用的最高标准,包括 IE9。
【讨论】:
【参考方案10】:这并不完全是一个解决方案,但我觉得它是最好的一个。在我们的 Intranet 站点上,我们告诉人们它只能通过 Firefox 访问,我们对这里的 IE 用户不友好。检查服务器或客户端的用户代理并拒绝他们从 IE 访问。我是一名 .NET 程序员。
【讨论】:
我喜欢你的想法。但我们这里没有 Firefox。 最差。建议。曾经。这与所有仅支持 IE 的 Intranet 站点一样糟糕。尝试做一些额外的工作,让你的东西在所有常见的浏览器上运行。没那么难。 @mhenry1384 想解释一下为什么锁定 Intranet 系统是一个糟糕的建议?您不必为旧浏览器支持夸克。您知道您的用户将获得预期的体验。它不是公共系统,谁在乎,你还支持 IE 5.5 吗?我告诉我的公共用户更新。无论如何,我不应该在后端系统上浪费时间,需要我的是公众。这不像我将它锁定到 IE 6 并需要 ActiveX 之类的。例如我的系统允许 Firefox 6 及更高版本。所以如果 Firefox 27 出来了,它仍然可以工作。要么对我投反对票,要么提出实际的论点。 我使用过的每个被锁定到特定浏览器的 Intranet 站点都被锁定到 IE。这让我发疯,因为我和下一个人一样讨厌 IE。强迫您的用户使用您选择的浏览器(而不是他们的浏览器),即使它不是 IE,也似乎与网络相反,甚至与 Intranet 网络相反。让一个网站在 IE7/8/9 中运行通常并不难,尤其是如果您使用像 jQuery 这样的库。让用户随心所欲。 例如,为 Firefox 10 编写的网站,根据我的经验,几乎总是可以在 IE9 上完美运行而无需修改。因此,限制用户使用 IE9 意味着还有其他事情发生。它表明你是在一个理想的使命,而不是试图编写好的网络软件的人。如果只是没有时间测试Firefox以外的浏览器的问题,您是否也限制人们使用Opera? 【抱歉这么啰嗦。我应该回去解决我遇到的这个该死的 IE8 问题... :-) ]【参考方案11】:我一直在努力解决这个问题,并希望帮助提供独特的解决方案和见解。
某些基于 AJAX 的框架将在 <head>
的开头注入 javascript 和样式表,这样做似乎会阻止完善的元标记解决方案正常工作。在这种情况下,我发现直接注入 HTTP 响应标头,就像 Andras Csehi 的回答一样可以解决问题。
对于我们这些使用 Java Servlet 的人来说,解决这个问题的一个好方法是使用 ServletFilter。
public class EmulateFilter implements Filter
@Override
public void destroy()
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException
HttpServletResponse response = ((HttpServletResponse)arg1);
response.addHeader("X-UA-Compatible", "IE=8");
arg2.doFilter(arg0, arg1);
@Override
public void init(FilterConfig arg0) throws ServletException
【讨论】:
【参考方案12】:我们可以在Spring-Apache-tomcat环境中通过在RequestInterceptor方法中添加一行来解决这个问题-
//before the actual handler will be executed
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception
// Some logic
// below statement ensures IE trusts the page formatting and will render it acc. to IE 8 standard.
response.addHeader("X-UA-Compatible", "IE=8");
return true;
来自 - How to create filter and modify response header 的参考,它涵盖了我们如何通过 RequestInterceptor (Spring) 解决这个问题。
【讨论】:
【参考方案13】:如果您希望您的网站强制使用 IE 8 标准模式,请将此元标记与有效的 DOCTYPE 一起使用:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
注意“EmulateIE8”值而不是普通的“IE8”。
根据 IE 开发人员的说法,这应该是“在 IE8 标准模式下显示标准 DOCTYPE;在 Quirks 模式下显示 Quirks DOCTYPE。使用此标签覆盖客户端计算机上的兼容性视图并将标准强制为 IE8 标准。”
有关此 IE 博客文章的更多信息:http://blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx
【讨论】:
【参考方案14】:此问题与Force "Internet Explorer 8" browser mode in intranet 重复。
那里的响应表明无法禁用兼容性视图(在服务器端)-https://***.com/a/4130343/24267。情况似乎确实如此,因为我尝试过的任何建议都没有奏效。在 IE8 中,无论您发送哪种 X-UA-Compatible 标头,“浏览器模式”都会设置为 Internet Explorer 8 兼容性视图。
我不得不对 IE7 和兼容模式进行一些特殊处理,这导致浏览器使用 IE8 进行渲染但报告它是 IE7,破坏了我的代码。 这就是我修复代码的方式(我知道这是一个可怕的 hack,我应该测试功能而不是浏览器版本):
isIE8 = navigator.appVersion.indexOf("MSIE") != -1 && parseFloat(navigator.appVersion.split("MSIE")[1]) == 8; if (!isIE8 && navigator.appVersion.indexOf("MSIE") != -1 && parseFloat(navigator.appVersion.split("MSIE")[1]) == 7 && navigator.appVersion.indexOf("Trident") != -1) // 骗子,这是兼容模式下的 IE8。 isIE8 = 真;【讨论】:
【参考方案15】:遇到了同样的问题。它通过使用
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" />
【讨论】:
【参考方案16】:在你的页面头标签中添加这个(针对你想要的 IE 版本):
<meta http-equiv="X-UA-Compatible" content="IE=8" />
注意,这不会改变浏览器显示其处于兼容模式(称为浏览器模式)的事实,但页面将以 IE8 标准模式呈现。如果它仍然没有呈现你想要的样子,那可能是因为你的 javascript 错误地检查了 IE。版本。请参阅the following blog post 以确定您应该关闭哪个属性,因为即使您设置了元 X-UA-Compatible 标记,用户代理字符串仍会显示 MSIE 7.0。
在我的情况下,为了修复,我必须添加对 IE7 兼容模式的检查。我使用了一个简单的 javascript 代码:
//IE8 and later will have the word 'trident' in its user agent string.
if (navigator.userAgent.indexOf("Trident")>-1) //do something
【讨论】:
【参考方案17】:对于阅读本文并希望通过 GPO 为所有用户禁用此功能的其他人,设置如下:
计算机配置/管理模板/Windows 组件/Internet Explorer/兼容性视图/打开本地 Intranet 的 Internet Explorer 标准模式
虽然 web.config 编辑为我修复了它。
【讨论】:
要转到本地组策略编辑器,您可以从运行中运行gpedit.msc。【参考方案18】:更改 .htaccess 中的标题
BrowserMatch MSIE ie
Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie
在这里找到了解决这个问题的方法:https://github.com/h5bp/html5-boilerplate/issues/378
【讨论】:
不是每个人都在使用 Apache【参考方案19】:Stefan S 关于文档模式与浏览器模式的评论非常适合我的问题。
我在页面中有 X-UA-Content 元数据,但我在客户端通过 navigator.appVersion
测试浏览器版本。这个测试没有反映元数据,因为它给出的是浏览器模式而不是文档模式。
我的答案是测试document.documentMode
类似:
function IsIE(n)
if (navigator.appVersion.indexOf("MSIE ") == -1) return false;
var sDocMode = document.documentMode;
return (isFinite(sDocMode) && sDocMode==n);
现在,我的元 X-UA-Content 标记反映在我的浏览器测试中。
为什么我会做这样一件令人不快的事情来测试浏览器?速度。我的各种 jQuery 加载项,如 tablesorter 在 IE6/7 上太慢了,我想关闭它们。我不确定测试浏览器功能是否能帮助我解决这个问题。
【讨论】:
以上是关于覆盖内网兼容模式 IE8的主要内容,如果未能解决你的问题,请参考以下文章