首页 文章

覆盖Intranet兼容模式IE8

提问于
浏览
200

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

19 回答

  • 0

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

  • 84

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

    enter image description here

  • 0

    我能够通过在头部区域中将元标记指定为 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" >
    

    将链接标记移开并且工作正常

    THIS WORKS

    <head><meta http-equiv="x-ua-compatible" content="IE=9" >
    

    所以设置为使用兼容性的IE8客户端将页面呈现为IE8标准模式 - content ='IE = 9'表示使用最高标准,包括IE9 .

  • 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 {
    }
    
    }
    
  • 4

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

    如果你选中了"Display intranet sites in compatibility view",这将无法正常工作并强制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 环境中强制进入兼容模式 .

    UPDATE — ADDITIONAL INFO: 但请注意,有一个技巧可以使HTML5 boilplate工作:

    添加一个emtpy条件注释 before 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]-->
    

    blog post that was inspired by the first part of this answer,有更多细节 . And by the way: 如该博客文章中所述,还可以使用 no condition<!--[]--> 替换带有半条件注释的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) - 将浏览器带入怪癖 - 模式 .

  • -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)解决这个问题 .

  • 0

    有同样的问题 . 它通过使用工作

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

    试试这个metatag:

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

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

  • 19

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

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

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

  • 2

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

    如果您希望您的网站强制使用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

  • 0

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

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

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

    要点:

    • 使用元标记和 Headers 设置信息都有效

    • 元标记优先于标头

    • 元标记必须是第一个标记,以确保浏览器在基于启发式之前不确定渲染引擎

    一个重点(我认为很多混淆来自这一点)是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

    根据我的经验,兼容性元数据将 only influence the document mode . 因此,如果您依赖浏览器检测,这对您没有帮助 . 但是如果你正在使用特征检测,这应该是要走的路 .

    所以我建议使用这种语法使用元标记(在html页面中):

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

    注意:列出您已测试的浏览器模式 .

    该博客文章还建议不要使用EmulateIEX . 这里有一个引用:

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

  • 9

    更改.htaccess中的 Headers

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

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

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

  • 0

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

  • 1

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

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

    尝试在 Headers 中添加以下内容:

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

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

  • 3

    这个问题与Force "Internet Explorer 8" browser mode in intranet重复 .

    那里的响应表明无法禁用兼容性视图(在服务器端) - https://stackoverflow.com/a/4130343/24267 . 这似乎确实如此,因为我尝试过的建议都没有奏效 . 在IE8中,无论您发送什么样的X-UA兼容标头,"Browser Mode"都会设置为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;
    }
    
  • 7

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

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

    注意, this will NOT change the fact that the browser says its in compatibility mode (称为浏览器模式),但页面 will 呈现在IE8标准模式下 . 如果它的STILL没有呈现你想要的样子,可能是因为你有javascript错误地检查了I.E.版 . 请参阅the following blog post以确定应该键入哪个属性,因为 even if you set the meta X-UA-Compatible tag, the user agent string will still say 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 }
    

相关问题