覆盖Intranet兼容模式IE8


200

默认情况下,IE8强制Intranet网站进入兼容模式。我尝试将meta标头更改为IE8,但它不承认meta标头,仅使用浏览器设置。有谁知道如何禁用此功能?



2
将此添加到您的页面标题标签中:<meta http-equiv =“ X-UA-Compatible” content =“ IE = 8” />(定位到您想要的IE版本)。请注意,这不会改变浏览器说它处于兼容模式(称为浏览器模式)的事实,但是页面将​​以IE8标准模式呈现。然后,如果您检查IE8或更高版本,则需要更改javascript以检查“三叉戟”。参见:blogs.msdn.com/b/mikeormond/archive/2008/09/25/…–
n00b

@ n00b-这对我的网站没有影响。
皮特2014年

我的理解是meta标签必须在head标签之后。我注意到有些脚本将插入索引0的头部;因此,meta标签将不再位于头部之后。
2015年

Answers:


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

20
这是正确的答案。meta标签没有任何作用,但是添加响应标头即可。这里更多的信息:social.msdn.microsoft.com/Forums/is/iewebdevelopment/thread/...
russau

3
同意。这应该是正确的答案,因为它可以正确覆盖仅此网站的Intranet设置。
enriquein's

9
(澄清:它适用于文档模式,但不适用于浏览器模式)
类似于代码

21
这不是正确的答案。此答案将更改文档模式,但不会更改重要的“浏览器模式”。我仍在寻找解决该问题的方法。
DeveloperChris

4
这不是正确的答案,因为它是.net特定的(甚至不承认事实)。
Daddy32

84

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

这将无法正常工作,并会迫使IE在Intranet中进入兼容模式如果您已选中“在兼容性视图中显示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 之前添加一个空的条件注释。并注意为好,当你做那个,那么你可以添加条件注释周围的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>),例如通过另一个问题的答案所解释的,将激活众所周知的问题,即对于不支持IE的旧版IE版本X-UA-Compatioble(针对IE7和IE6,请参见:)怪癖模式。


这并没有为我解决问题。但是,仅供参考,添加“ X-UA兼容”作为标题DID可以解决此问题!
Scott Rippey 2012年

34

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


19
我没有投票,但是我想这是因为您是从用户的角度回答的(用户应该怎么做)。这个问题来自网络开发人员,正在询问如何解决该问题,而无需用户特别做任何事情。
罗伊·廷克

1
另外,这不允许保持与旧应用程序的兼容性。如果您取消选中该设置,则旧应用可能会损坏而无法更新它们。我认为询问者正在寻求一种方法,当其Intranet上的所有其他应用程序都需要选中复选框的兼容模式时,强制采用标准模式。
安德鲁·刘易斯2010年

2
我相信他确实从程序员的角度回答了这个问题。“ ... IE将使用基于DOCTYPE的模式”。请参阅:msdn.microsoft.com/zh-cn/library/ms535242%28VS.85%29.aspx 如果公司运行的是Active Directory,则管理员可以传播对浏览器设置的更改。使用FireFox无法做到这一点!
Nate Zaugg

@AndrewLewis。但是,URL栏中有兼容模式按钮,该按钮会将浏览器设置为对该特定站点使用兼容模式。或者,您可以在对话框中手动添加它们。同样,这些工作可以由IT在全球范围内完成。
PilotBob

2
@PilotBob如果您有120K +用户和数百个(如果没有数千个)Intranet站点要支持,则这不是可行的解决方案。
yorch

19

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

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

我认为此博客条目很好地概述了如何使用兼容性元信息,根据我的经验,该工作如下所述: http //blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x- ua兼容创建耐用型企业web应用程序.aspx

要点:

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

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

  1. 文件方式
  2. 浏览器模式

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

浏览器模式确定IE将哪些User-Agent(UA)字符串发送到服务器,IE默认使用的文档模式以及IE如何评估条件注释。

可以在本文中找到有关文档模式与浏览器模式的更多信息:http : //blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compatibility-features-for- site-developers.aspx?Redirected = true

以我的经验,兼容性元数据只会影响文档模式。因此,如果您依赖浏览器检测,这将无济于事。但是,如果您使用的是特征检测,则应该这样做。

因此,我建议使用以下语法使用meta标记(在html页面中):

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

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

该博客文章还建议不要使用EmulateIEX。这里引用:

话虽如此,我确实感到奇怪的是,当应用程序请求EmulateIE7或EmulateIE8时。这些仿真模式本身就是决策。因此,您不是要具体想要什么,而是要问两件事之一,然后通过在代码中的其他地方查找DOCTYPE来确定这两件事中的哪一个(然后尝试了解该DOCTYPE是否会为您提供标准或根据其内容而有所不同-有时会令人困惑的任务)。与其说这样做,不如说是直接指定您想要的内容,而不是给出本身就是问题的答案,这显然更有意义。如果要IE7标准,请使用IE = 7,而不是IE = EmulateIE7。(请注意,这并不意味着您不应使用DOCTYPE,而应该使用。)


如何更改浏览器模式?
Vishnudev K

浏览器模式中的句子令人困惑
Justice Fist

@JusticeFist是的,您是对的,谢谢。我试图改善它。
stefan.s 2014年

1
@VishnudevK我知道的唯一方法是使用开发人员工具。但是您可能需要编程解决方案。
stefan.s 2014年

9

试试这个元标记:

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

即使选中了“在兼容性视图中显示Intranet网站”(对于Intranet或所有网站),它也应强制IE8呈现为IE8标准模式。我在IE 8.0.6上尝试了自己的方法


15
不,不是的。
丹尼斯C 2010年

11
这实际上是正确的,但是它必须出现在页面上的所有META标记之前,否则将不起作用。
Michael Irigoyen

2
这对我不起作用。据我所知,IE8的“在兼容模式下显示Intranet网站”是不可替代的
Codeulike

6
(澄清:它适用于文档模式,但不适用于浏览器模式。因此,渲染是固定的,但浏览器仍伪装为IE7)
类似于

7

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

在此处输入图片说明


1
如果Intranet上的所有站点都可以使用最新的Web标准,则此解决方案将非常有效。但是,如果某些方法不能解决,那么该方法将无意间破坏这些方法。
2014年

4

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

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

1
特定于开发平台的答案...甚至都没有指定平台。我猜您在谈论Visual Studio .NET吗?据我所知,'OnInit'事件不存在(在Javascript,Java,PHP等中)
Stijn de Witt 2013年


3

通过将meta标签指定为头部中的THE FIRST TAG,我能够覆盖兼容性模式,而不仅是第一个meta标签,而且还指定为VERY FIRST TAG

感谢@ stefan.s为您提供了出色的答复,让我投入其中。在阅读之前,我有:

这没用

<head> 
<link rel="stylesheet" type="text/css" href="https://stackoverflow.com/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(包括IE9)的最高标准。


2

这并非完全解决方案,但我认为这是最好的解决方案。在我们的Intranet网站上,我们告诉人们只能通过Firefox访问它,我们对这里的IE用户并不友好。检查服务器或客户端上的用户代理,并拒绝他们从IE访问。我是.NET程序员。


1
我喜欢你的主意 但是我们这里没有Firefox。
丹尼斯C 2010年

22
最差 建议。曾经 就像所有仅IE的Intranet网站一样糟糕。尝试做一些额外的工作,并使您的内容在所有常见的浏览器上都能正常工作。没那么难。
mhenry1384 2012年

2
@ mhenry1384关心解释为什么它是一个可怕的建议,要求锁定Intranet系统?您不必为旧版浏览器支持夸克。您知道您的用户将获得预期的体验。这不是一个公共系统,谁在乎,您是否仍支持IE 5.5?我告诉我的公共用户进行更新。无论如何,我都不应该在后端系统上浪费时间,公众需要我。这不像我将其锁定为IE 6一样需要ActiveX。例如,我的系统允许使用Firefox 6及更高版本。因此,如果Firefox 27出现,它仍然可以工作。否决我或提出一个实际的论点。
凯门2012年

2
我使用过的每个Intranet站点都已锁定到特定的浏览器,并且都已锁定到IE。这让我发疯,因为我和下一个家伙一样讨厌IE。即使是BUT IE,强迫用户使用您选择的浏览器(而不是他们的浏览器)似乎与Web(甚至是Intranet Web)相反。使网站在IE7 / 8/9中工作通常并不难,尤其是在使用jQuery之类的库时。让用户使用他们想要的东西。
mhenry1384'3

2
以我的经验为例,为Firefox 10编写的网站几乎无需修改就可以在IE9上正常运行。因此,限制用户使用IE9意味着发生了其他事情。这表明您正在执行思想上的任务,而不是试图编写优质Web软件的人员。如果只是没有时间测试Firefox以外的浏览器的问题,您是否还限制人们使用Opera?[抱歉这么罗y。我应该回过头来解决这个令人讨厌的IE8问题... :-)]
mhenry1384

1

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

某些基于AJAX的框架会在开始时注入javascript和样式表,<head>并且这样做似乎妨碍了已建立好的元标记解决方案正常工作。在这种情况下,我发现直接注入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 {
}

}

1

我们可以在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)解决此问题。


0

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


0

此问题是IntranetForce“ Internet Explorer 8”浏览器模式的重复。

那里的响应表明无法禁用兼容性视图(在服务器端)-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;
如果(!isIE8 && navigator.appVersion.indexOf(“ MSIE”)!= -1 && parseFloat(navigator.appVersion.split(“ MSIE”)[1])== 7 && navigator.appVersion.indexOf(“ Trident”) != -1){
    //骗子,这是兼容模式下的IE8。
    isIE8 = true;
}

0

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

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

0

将此添加到您的页面标题标签中(定位到您想要的IE版本):

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

请注意,这不会改变浏览器说它处于兼容模式(称为浏览器模式)的事实,但是页面将以 IE8标准模式呈现。如果它仍然无法呈现您的期望,那可能是因为您使用的JavaScript错误地检查了IE版本。请参阅以下博客文章,确定您应该键入的属性,因为即使您设置了meta 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 }

0

对于其他希望通过GPO对所有用户禁用此功能的用户,此设置为:

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

尽管web.config编辑为我修复了它。


要转到“ 本地组策略编辑器”,可以从“运行” 运行gpedit.msc
ROMANIA_engineer


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加载项(如表排序器)在IE6 / 7上都太慢了,我想将其关闭。我不确定测试浏览器功能是否可以帮助我解决此问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.