覆盖内网兼容模式IE8

IE8默认强制内网网站进入兼容模式。我尝试将元标头更改为IE8,但它不承认元标头,只是使用浏览器设置。有人知道怎么解除这个吗?

148898 次浏览

如果您下拉“工具”菜单并选择“兼容性视图设置”,在底部的对话框中有一个设置“以兼容性模式显示intranet站点”。如果你取消勾选这个选项,问题就解决了,IE将使用基于DOCTYPE的模式。

这不是一个确切的解决办法,但我觉得这是最好的办法。在我们的内部网网站上,我们告诉人们它只能通过Firefox访问,我们在这里并不友好地对待IE用户。检查服务器端或客户端是否存在用户代理,拒绝用户代理通过IE访问。我是一个。net程序员。

试试这个元标签:

<meta http-equiv="X-UA-Compatible" content="IE=8" />

它应该强制IE8呈现为IE8标准模式,即使“在兼容性视图中显示内部网站点”被选中[无论是内部网还是所有网站],我自己在IE 8.0.6上尝试过

如果你想让你的网站强制IE 8标准模式,那么使用这个元标签和一个有效的DOCTYPE:

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />

注意“EmulateIE8”值而不是普通的“IE8”。

根据IE开发人员的说法,这应该是“在IE8标准模式中显示标准doctype;在Quirks模式下显示Quirks DOCTYPEs。使用此标记覆盖客户端机器上的兼容性视图,并将标准强制到IE8标准。”

关于IE博客文章的更多信息:http://blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx

在内部网中,可以覆盖兼容模式。

对于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')

试着在头文件中加入以下内容:

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

Paul Irish的HTML5样板(但它也适用于XHTML Transitional)。

我也有同样的问题。它通过使用

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" />

Michael Irigoyen是正确的,但这有点复杂…

如果你使用的是保罗爱尔兰的样板,那么你会有如下的东西:-

<!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进入兼容性模式。为了避免内网兼容模式,需要删除IE注释中的条件注释。

所以下面的代码将工作:

<!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注释,那么如果你运行默认设置的IE9,你将被迫进入内部网环境中的兼容性模式。

更新-附加信息: 但请注意,有一个技巧可以使HTML5样板工作:

在DOCTYPE中添加一个空的条件注释之前。还要注意的是,当你执行时,你可以X-UA-Compatible指令周围添加条件注释,使页面在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]-->

A 这篇博客文章的灵感来自于这个答案的第一部分,有更多的细节。正如在那篇博客文章中提到的,还可以用任何条件下都不: <!--[]-->半条件注释替换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>)将激活众所周知的问题,如这是另一个问题的答案所解释的那样,对于不支持X-UA-Compatioble的遗留IE版本(即:对于IE7和IE6),将浏览器带入怪异模式。

我一直在纠结这个问题,希望能提供一个独特的解决方案和见解。

某些基于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 {
}


}

这个问题是Force "Internet Explorer 8;内网浏览器模式的重复。

那里的响应表明不可能禁用兼容性视图(在服务器端)- https://stackoverflow.com/a/4130343/24267。这似乎是事实,因为我尝试过的建议都不起作用。在IE8中,“浏览器模式”被设置为Internet Explorer 8兼容性视图,无论你发送哪种类型的X-UA-Compatible头。

我必须为IE7和兼容性模式做一些特殊处理,这导致浏览器使用IE8渲染,但报告它是IE7,破坏了我的代码。 这就是我如何修复我的代码(我知道这是一个可怕的黑客,我应该测试功能而不是浏览器版本):

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) {
// Liar, this is IE8 in compatibility mode.
isIE8 = true;
}

我们的系统管理员通过取消我们组织的全局复选框解决了此问题。用户甚至不需要注销。

enter image description here

我们可以在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;
}

它涵盖了我们如何通过RequestInterceptor (Spring)解决这个问题。

我找到了一个工作答案,允许覆盖检查的内部网兼容性视图。 只需添加在你的页面的OnInit事件这一行(没有元或web。config customHeader need):

Response.AddHeader("X-UA-Compatible", "IE=EmulateIE8");

在这个问题的答案中有一些困惑。

最主要的答案是当前的服务器端解决方案,它在http头中设置了一个标志,一些评论表明使用元标记的解决方案不起作用。

我认为这篇博客文章很好地概述了如何使用兼容性元信息,根据我的经验,如下所述: http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x-ua-compatible-to-create-durable-enterprise-web-applications.aspx < / p >

要点:

  • 使用元标记和在头中设置信息都有效
  • 元标记优先于标头
  • 元标记必须是第一个标记,以确保浏览器不会在基于启发式之前确定呈现引擎

重要的一点(我认为很多困惑来自于这一点)是IE有两类模式:

  1. 文档模式
  2. 浏览器模式

文档模式决定了渲染引擎(如何渲染网页)。

浏览器模式决定了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 -你应该。)

添加到你的页面头标签(针对你想要的IE版本):

<meta http-equiv="X-UA-Compatible" content="IE=8" />

注意,这不会改变浏览器说它在兼容模式的事实(称为浏览器模式),但页面呈现在IE8标准模式。如果它仍然没有呈现你所希望的,这可能是因为你有javascript错误地检查I.E.版本。请参阅以下博客文章以确定应该关闭哪个属性,因为即使你设置了元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 }

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上太慢了,我想把它们关掉。我不确定测试浏览器功能是否能帮助我解决这个问题。

对于其他阅读本文希望通过GPO为所有用户禁用此功能的人,以下是设置:

计算机配置/管理模板/Windows组件/Internet Explorer/兼容性视图/打开Internet Explorer本地Intranet标准模式

虽然网络。配置编辑为我修复了它。

我能够通过在头部分中指定元标记为第一个标签来覆盖兼容性模式,不仅是第一个元标记,而且仅作为第一个标签

谢谢@stefan。你的回答很精彩,让我明白了。在阅读之前,我有:

这并没有起作用

<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。

修改.htaccess中的头文件

BrowserMatch MSIE ie
Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie

找到这个问题的解决方案在这里:https://github.com/h5bp/html5-boilerplate/issues/378