覆盖Intranet兼容模式IE8

时间:2010-03-25 18:17:52

标签: internet-explorer internet-explorer-8 intranet compatibility-mode

默认情况下,IE8会强制Intranet网站进入兼容模式。我尝试将元标题更改为IE8,但它不会确认元标题,只是使用浏览器设置。有谁知道如何禁用它?

19 个答案:

答案 0 :(得分:224)

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

答案 1 :(得分:84)

迈克尔·伊里戈延是正确的,但它有点复杂......

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

更新 - 附加信息: 但请注意,有一个技巧可以使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]-->

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

答案 2 :(得分:34)

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

答案 3 :(得分:19)

在这个问题的答案中存在一定程度的混淆。

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

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

要点:

  • 使用元标记和标题设置信息都可以正常工作
  • 元标记优先于标题
  • 元标记必须是第一个标记,以确保浏览器在基于启发式之前不确定渲染引擎

一个重要的观点(我认为很多混淆来自于这一点)是IE有两个“类”模式:

  1. 文档模式
  2. 浏览器模式
  3. 文档模式决定了渲染引擎(如何呈现网页)。

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

答案 4 :(得分:9)

试试这个metatag:

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

它应该强制IE8呈现为IE8标准模式,即使“在兼容性视图中显示内部网站点”被检查[对于内部网或所有网站],我在IE 8.0.6上尝试了我自己

答案 5 :(得分:7)

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

enter image description here

答案 6 :(得分:4)

我找到了一个可以覆盖已检查的Intranet兼容性视图的工作答案。 只需在此行的页面的OnInit事件中添加(无meta或web.config customHeader需要):

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

答案 7 :(得分:3)

我能够通过在头部区域中将元标记指定为 THE FIRST TAG 来覆盖兼容模式,而不仅仅是第一个元标记,而且仅作为非常第一个标记< / strong>即可。

感谢@ 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。

答案 8 :(得分:3)

尝试在标题中添加以下内容:

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

礼貌Paul Irish's HTML5 Boilerplate(但它也适用于XHTML Transitional)。

答案 9 :(得分:2)

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

答案 10 :(得分:1)

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

某些基于AJAX的框架将在<head>的开头注入javascripts和样式表,这样做似乎阻止了成熟的元标记解决方案正常工作。在这种情况下,我发现直接注入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 {
}

}

答案 11 :(得分:1)

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

来自 - How to create filter and modify response header的引用它介绍了我们如何通过RequestInterceptor(Spring)解决这个问题。

答案 12 :(得分:0)

此问题与Force "Internet Explorer 8" browser mode in intranet重复。

那里的回复表明无法禁用兼容性视图(在服务器端) - https://stackoverflow.com/a/4130343/24267。当然情况确实如此,因为我尝试过的建议都没有奏效。在IE8中,无论您发送什么样的X-UA兼容标题,“浏览器模式”都会设置为Internet Explorer 8兼容性视图。

我必须对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;
}

答案 13 :(得分:0)

对于其他阅读此内容的人,希望通过GPO为所有用户禁用此功能,这是设置:

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

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

答案 14 :(得分:0)

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);
}

现在,我的meta X-UA-Content标记反映在我的浏览器测试中。

为什么我要测试浏览器这样的东西?速度。各种我的jQuery插件,比如tablesorter,在IE6 / 7上速度太慢了,我想关闭它们。我不确定测试浏览器功能可以帮助我解决这个问题。

答案 15 :(得分:0)

在页面标题内添加此标记(定位到您想要的IE版本):

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

注意,这不会改变浏览器显示其处于兼容模式(称为浏览器模式)的事实,但页面以IE8标准模式呈现。如果它的STILL没有呈现你想要的方式,可能是因为你有javascript错误地检查了I.E.版。请参阅the following blog post以确定您应该关注哪个属性,因为即使您设置了元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 }

答案 16 :(得分:0)

有同样的问题。它使用

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

答案 17 :(得分:0)

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

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

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

根据IE开发人员的说法,这应该是“在IE8标准模式下显示标准DOCTYPE;在Quirks模式下显示怪癖DOCTYPE。使用此标记覆盖客户端计算机上的兼容性视图并强制标准符合IE8标准。”

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

答案 18 :(得分:-1)

更改.htaccess

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

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