覆盖Intranet兼容模式IE8

默认情况下,IE8强制Intranet网站进入兼容模式。 我试图改变元首到IE8,但它不承认元首,只使用浏览器设置。 有谁知道如何禁用这个?

可以在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') 

迈克尔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在Intranet环境中进入兼容模式。 您需要删除条件IE注释以防止Intranet兼容模式。

所以下面的代码将工作:

 <!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注释,那么你将被强制进入Intranet环境的兼容模式使用默认设置运行IE9。

更新 – 额外的信息: 但请注意,有一个技巧,将使HTML5锅炉的工作:

在DOCTYPE 之前添加一个emtpy条件注释。 另外请注意,当你这样做的时候,你也可以在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]--> 

受到这个答案的第一部分的启发的博客文章有更多的细节。 顺便说一句:正如在该博客文章中提到的,也可以用条件注释代替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 X-UA-Compatioble (读取:对于IE7和IE6) – 使浏览器进入怪癖模式。

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

对这个问题的答案有一定的困惑。

最热门的答案是目前服务器端的解决方案,它在http标头中设置一个标志,一些评论指出使用meta标签的解决方案不起作用。

我认为这个博客条目给出了一个如何使用兼容性元信息的很好的概述,并在我的经验作品描述: http : //blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x- UA兼容到创建持久-企业网络applications.aspx

要点:

  • 使用meta标签设置信息并在标题中都有效
  • 元标记优先于标题
  • 元标记必须是第一个标记,以确保浏览器之前不基于启发式确定渲染引擎

一个重要的观点(我认为从这一点来看,很多困惑)是IE有两个模式的“类”:

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

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

浏览器模式确定什么用户代理(UA)字符串IE发送到服务器,哪些文档模式IE默认,以及IE如何评估条件注释。

有关文档模式和浏览器模式的更多信息,请参阅本文: http : //blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compatibility-features-for-网站developers.aspx?重定向=真

根据我的经验,兼容性元数据只会影响文档模式 。 所以,如果你依靠浏览器检测,这不会帮助你。 但是,如果你正在使用功能检测,这应该是要走的路。

所以我建议使用这个语法来使用meta标签(在html页面中):

 <meta http-equiv="X-UA-Compatible" content="IE=9,10" ></meta> 

注意:给出你已经测试过的浏览器模式列表。

博客文章也建议不要使用EmulateIEX。 这里有一个报价:

这就是说,有一件事情我觉得奇怪的是,当一个应用程序请求EmulateIE7,或EmulateIE8。 这些模拟模式本身就是决定。 所以,你不是要明确你想要什么,而是要求两件事情之一,然后通过在代码的其他地方查找一个DOCTYPE来确定这两件事情中的哪一件(然后试图了解该DOCTYPE是否会给你标准或根据其内容怪癖 – 另一个有时令人困惑的任务)。 而不是那样做,我认为直接指定你想要的,而不是给出一个本身就是问题的回答就显得更有意义了。 如果你想要IE7的标准,那么使用IE = 7,而不是IE = EmulateIE7。 (请注意,这并不意味着你不应该使用DOCTYPE – 你应该。)

试试这个元标签:

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

它应该强制IE8呈现为IE8标准模式,即使“显示内部网站兼容性视图”选中[内部网或所有网站],我试了我自己在IE浏览器8.0.6

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

在这里输入图像描述

我发现一个工作的答案,允许覆盖选中的Intranet兼容性视图。 只要在你的页面的OnInit事件中添加这行(不需要元或web.config customHeader需要):

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

尝试在标题中放入以下内容:

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

由Paul Irish提供的HTML5 Boilerplate (但也可以在XHTML Transitional中使用)。

我可以通过在头部指定元标记作为第一个标记来覆盖兼容模式,而不仅仅是第一个元标记,而且仅仅作为第一个标记

感谢@ 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标准模式 – 内容=“IE = 9”意味着使用最高可用的标准,包括IE9。

这不完全是一个解决方案,但我觉得这是最好的。 在我们的内部网站上,我们告诉人们只能通过Firefox访问,我们不会对这里的IE用户好心。 检查服务器或客户端上的用户代理,并拒绝他们从IE访问。 而且我是一个.NET程序员。

我一直在努力解决这个问题,并希望提供一个独特的解决方案和见解。

某些基于AJAX的框架会在<head>的开始部分注入javascript和样式表,这样做似乎阻止了良好建立的元标记解决方案的正常工作。 在这种情况下,我发现直接注入到HTTP响应头中,就像Andras Csehi的答案一样可以解决这个问题。

对于我们这些使用Java Servlets的人来说,解决这个问题的一个好方法就是使用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 { } } 

我们可以通过在RequestInterceptor方法中添加一行来解决Spring-Apache-tomcat环境中的这个问题 –

 //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)来解决这个问题。

如果您希望您的网站强制使用IE 8标准模式,请使用此元标记以及有效的DOCTYPE:

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

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

根据IE开发者的说法,这应该是:“在IE8标准模式下显示标准DOCTYPE;在怪癖模式下显示怪癖DOCTYPE。使用这个标签覆盖客户端机器上的兼容性视图,强制标准符合IE8标准。

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

这个问题是在Intranet中强制“Internet Explorer 8”浏览器模式的一个副本。

那里的响应表明,无法禁用兼容性视图(在服务器端) – https://stackoverflow.com/a/4130343/24267 。 这当然似乎是这样的,因为我没有尝试过的建议工作。 在IE8中,“浏览器模式”被设置为Internet Explorer 8兼容性视图,而不管您发送的X-UA兼容头是哪种类型。

我不得不做一些特殊的处理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){
     //说谎,这是IE8兼容模式。
     isIE8 = true;
 }

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

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

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

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

请注意, 这不会改变浏览器在兼容模式 (称为浏览器模式)中表示的事实 ,但页面将以 IE8标准模式呈现。 如果它仍然没有呈现你想要的,可能是因为你有错误地检查IE版本的JavaScript。 请参阅以下博客文章,以确定应该关闭哪个属性,因为即使设置了meta X-UA兼容标记,用户代理字符串仍然会说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 } 

对于阅读本文的其他人来说,通过GPO为所有用户禁用此设置,设置如下:

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

虽然web.config编辑修复了我。

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

更改.htaccess中的标题

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

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