默认情况下,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')
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">
如果您选中了“在兼容性视图中显示 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 之前添加一个空的条件注释。另请注意,当您执行 that 时,您可以也在 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,有更多细节。 顺便说一句:正如那篇博文中提到的,还可以将 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]-->
但请注意,如 this answer to another question 所解释的,后一种变体 (<--[]--><!DOCTYPE html>
) 将激活众所周知的问题,即它 - 对于不支持 X-UA-Compatioble
的旧版 IE 版本(阅读:对于 IE7 和 IE6) - 带来浏览器进入怪癖模式。
如果您下拉“工具”菜单并选择“兼容性视图设置”,则在底部的对话框中设置“以兼容模式显示 Intranet 站点”。如果您取消选中此项应该可以解决问题,并且 IE 将使用基于 DOCTYPE 的模式。
这个问题的答案存在一定程度的混淆。
最佳答案目前是一个服务器端解决方案,它在 http 标头中设置了一个标志,并且一些评论表明使用元标记的解决方案不起作用。
我认为这篇博客文章很好地概述了如何使用兼容性元信息,并且根据我的经验,其工作方式如下所述:http://blogs.msdn.com/b/cjacks/archive/2012/02/29/using-x-ua-compatible-to-create-durable-enterprise-web-applications.aspx
要点:
使用元标记和标题设置信息都有效
元标记优先于标头
元标记必须是第一个标记,以确保浏览器不会在之前基于启发式确定渲染引擎
重要的一点(我认为这一点引起了很多混乱)是 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
以我的经验,兼容性元数据只会影响文档模式。因此,如果您依赖浏览器检测,这将无济于事。但是,如果您使用的是特征检测,这应该是可行的方法。
因此,我建议使用以下语法使用元标记(在 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" />
即使选中“在兼容性视图中显示 Intranet 站点”,它也应该强制 IE8 呈现为 IE8 标准模式 [对于 Intranet 或所有网站],我在 IE 8.0.6 上自己尝试过
我们的系统管理员通过取消选中我们组织的全局复选框来解决此问题。用户甚至不需要注销。
https://i.stack.imgur.com/TBuRY.jpg
我找到了一个允许覆盖选中的 Intranet Compatibility View 的有效答案。只需在页面的 OnInit 事件中添加这一行(不需要 meta 或 web.config customHeader):
Response.AddHeader("X-UA-Compatible", "IE=EmulateIE8");
尝试将以下内容放在标题中:
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
礼貌Paul Irish's 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 标准模式 - content='IE=9' 表示使用最高可用的最高标准,包括 IE9。
这不完全是一个解决方案,但我觉得它是最好的一个。在我们的 Intranet 站点上,我们告诉人们它只能通过 Firefox 访问,我们对这里的 IE 用户不友好。检查服务器或客户端的用户代理并拒绝他们从 IE 访问。我是一名.NET 程序员。
我一直在努力解决这个问题,并希望帮助提供独特的解决方案和见解。
某些基于 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 {
}
}
我们可以在 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;
}
来自 - How to create filter and modify response header 的参考它涵盖了我们如何通过 RequestInterceptor (Spring) 解决这个问题。
如果您希望您的网站强制使用 IE 8 标准模式,请将此元标记与有效的 DOCTYPE 一起使用:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
请注意“EmulateIE8”值而不是普通的“IE8”。
根据 IE 开发人员的说法,这应该是“在 IE8 标准模式下显示标准 DOCTYPE;在 Quirks 模式下显示 Quirks DOCTYPE。使用此标签覆盖客户端计算机上的兼容性视图并强制标准为 IE8 标准。”
有关此 IE 博客文章的更多信息:http://blogs.msdn.com/b/ie/archive/2008/08/27/introducing-compatibility-view.aspx
此问题与 Force "Internet Explorer 8" browser mode in intranet 重复。
那里的响应表明无法禁用兼容性视图(在服务器端) - https://stackoverflow.com/a/4130343/24267。情况似乎确实如此,因为我尝试过的建议都没有奏效。在 IE8 中,无论您发送哪种 X-UA-Compatible 标头,“浏览器模式”都会设置为 Internet Explorer 8 兼容性视图。
我不得不对 IE7 和兼容模式做一些特殊处理,这导致浏览器使用 IE8 进行渲染,但报告它是 IE7,破坏了我的代码。这就是我修复代码的方式(我知道这是一个可怕的 hack,我应该测试功能而不是浏览器版本):
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; }
有同样的问题。它通过使用
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" />
在你的页面头标签中添加这个(针对你想要的 IE 版本):
<meta http-equiv="X-UA-Compatible" content="IE=8" />
请注意,这不会改变浏览器显示其处于兼容模式(称为浏览器模式)的事实,但页面将以 IE8 标准模式呈现。如果它仍然没有呈现您希望的样子,可能是因为您的 javascript 错误地检查了 IE 版本。请参阅 the following blog post 以确定您应该关闭哪个属性,因为即使您设置了元 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 }
对于其他阅读本文希望通过 GPO 为所有用户禁用此功能的其他人,这是设置:
计算机配置/管理模板/Windows 组件/Internet Explorer/兼容性视图/打开本地 Intranet 的 Internet Explorer 标准模式
虽然 web.config 编辑为我修复了它。
更改 .htaccess 中的标题
BrowserMatch MSIE ie
Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie
在此处找到此问题的解决方案:https://github.com/h5bp/html5-boilerplate/issues/378
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 上太慢了,我想关闭它们。我不确定测试浏览器功能是否可以帮助我解决这个问题。