企业IE11迁移指南:详解兼容性视图模式和本地Intranet站点

2015年11月19日

兼容性视图是IE最常用的向下兼容方案,它可以通过兼容性视图设置、组策略、本地Intranet站点来实现。巧妙地利用这些配置可以控制不同的子域名有些在兼容性视图中显示,有些在默认模式中显示。

兼容性视图概述

在兼容性视图模式下:

  1. IE发给服务器的User-Agent会包含“MSIE 7.0”令牌以模拟自己是IE7。
  2. 在选择默认文档模式时,会模拟IE7的选择行为,即:如果页面声明了<!DOCTYPE>,则使用IE7标准文档模式,不然则使用IE5 Quirks文档模式。

更多信息可阅读:企业IE11迁移指南:详解浏览器模式、文档模式、User-Agent和X-UA-Compatible

使用兼容性视图

以下是所有能够使网站以兼容性视图显示的方式。

  1. 手动添加网站到兼容性视图设置。
  2. Microsoft兼容性列表中的站点。
  3. IE组策略兼容性视图设置中配置的站点。
  4. 本地Intranet站点。

兼容性视图设置

工具 > 兼容性视图设置 中用户可以手动添加某个域名以兼容性视图模式显示。但通过该设置只能添加顶级域名,即便你添加:store.microsoft.com,最终得到的却是:microsoft.com。

兼容性视图设置

如上图所示,添加microsoft.com到列表后microsoft.com上的所有页面都将以兼容性视图模式显示。

Microsoft兼容性列表

Microsoft兼容性列表是一个存放于microsoft.com上的XML文件,微软会不定期地对这个列表进行更新。这个XML包括了许多互联网站点以及它们应该使用的浏览器模式,IE会解析这个XML并以指定的浏览器模式来显示这个站点。作为企业IT管理员,一般不需要过多地关注这个列表,因为企业内部的站点是不包含在这个列表内的。如果你是某公网站点的所有人或开发人员并希望从Microsoft兼容性列表中移除你的网站,你可以参考以下两篇文章。

组策略

我们可以通过下列组策略设置将指定的站点以兼容性视图显示。

管理模板 > Windows组件 > Internet Explorer > 兼容性视图:使用Internet Explorer 7站点上的“策略列表”

在同目录下还有一个组策略设置:Use Policy List of Quirks Mode sites,该设置与兼容性视图的区别是:就算页面声明了<!DOCTYPE>,IE也会使用IE5 Quirks文档模式渲染页面,除非该页面通过X-UA-Compatible指定了一个文档模式。

需要注意的是,上述两个设置仅在IE9及以上支持多级域名,如果你添加了一个多级域名,在IE8中是不生效的。

本地Intranet站点

默认情况下Intranet站点会以兼容性视图显示,可以通过:工具 > 兼容性视图设置 中的 在兼容性视图中显示Intranet站点 这个设置来关闭。

在兼容性视图中显示Intranet站点

所以我们也可以通过使一个站点成为本地Intranet站点来让它以兼容性视图模式显示。除了手动添加站点到本地Intranet站点列表,IE也会以一定的条件自动判断某个站点是否为地Intranet站点。

手动添加

可以通过:工具 > Internet 选项 > 安全 > 本地Intranet > 站点 > 高级 添加某个站点到本地Intranet。

添加网站至本地Intranet站点

组策略

我们可以通过下列组策略设置将指定的域名添加到本地Intranet。

管理模板 > Windows组件 > Internet Explorer > Internet Control Panel > 安全页:站点到区域分配列表

这个设置包含一个站点列表,可以给指定的域名按以下规则赋值。

  • 1: 本地Intranet
  • 2: 受信任的站点
  • 3: Internet
  • 4: 受限制的站点

如下图所示,将 windows.microsoft.com 添加到本地Intranet。

站点到区域分配列表

如果使用了该组策略设置后,用户之前自己手动添加的本地Intranet站点就不再生效了,并且用户无法从IE设置中更改这个列表的设置。如下图所示,用户可以查看当前列表,但添加、删除按钮是禁用的。

本地Intranet列表已禁用

自动检测

除了通过以上两种方法指定某个站点为Intranet站点,IE还会通过以下4个规则自动检测一个站点是否为本地Intranet。

  1. 如果站点域名中不包含英文句号:“.”,那么这个站点会被识别为本地Intranet站点,如:http://mysite。

  2. 如果在 Internet选项 > 连接 > 局域网设置 中指定使用某个代理服务器并在高级代理设置中将站点加入例外,那么该站点会被识别为本地Intranet站点。

    代理例外设置

    如上图所示,用户指定使用代理服务器:corpproxy:80,但windows.microsoft.com被加入了例外列表,即访问windows.microsoft.com时不会使用代理服务器,这种情况下windows.microsoft.com会被识别为本地Intranet站点。

  3. 如果在 Internet选项 > 连接 > 局域网设置 中勾选了 自动检测设置 并使用了WPAD配置脚本或者勾选了 使用自动配置脚本 且配置脚本的FindProxyForUrl方法最终对当前站点返回“DIRECT”,那么这个站点会被识别为本地Intranet站点。

    function FindProxyForURL(url, host) {
        if (url.indexOf('azure.microsoft.com') > -1) {
            return 'DIRECT';
        } else {
            return 'PROXY corpproxy:80';
        }
    }
    

    如IE使用了上述配置脚本,那么azure.microsoft.com会被识别为本地Intranet站点。

  4. 如果URL是一个UNC网络路径,那么这个站点会被识别为本地Intranet站点,如:\\tsclient\c\www\index.html。

上面四个规则可以通过 工具 > Internet 选项 > 安全 > 本地Intranet > 站点 下的三个选项开启或关闭。

  1. 包括没有列在其他区域的所有本地(Intranet)站点,该选项可以控制第一条规则。
  2. 包括所有不使用代理服务器的站点,该选项可以控制第二和第三条规则。
  3. 包括所有网络路径(UNC),该选项可以控制第四条规则。

本地Intranet自动检测设置

自动检测仅在加域的机器上工作,一台没有加域的机器,http://localhost 是不会被识别为本地Intranet站点的。如果要使未加域的机器应用上述规则,需要取消勾选 自动检测Intranet网络 选项,然后手动勾选需要应用的规则。

常见问题

为何一个受信任站点也会以兼容性视图显示?

如果一个受信任站点以兼容性视图显示,有以下四种可能。

  1. 用户通过兼容性视图设置中添加了该站点。
  2. IT管理员在组策略的兼容性设置中添加了该站点。
  3. Microsoft兼容性列表包含该站点并指定其以兼容性视图模式显示。
  4. 该站点满足自动检测本地Intranet站点的条件。

前三点都比较容易排查,第四点往往会被忽视。假设在一台域内的机器上,用户指定了 http://localhost 为受信任站点,这种情况下 http://localhost 依然会以兼容性视图显示因为其满足被检测为本地Intranet的条件。如果想解决这个问题,可以考虑以下解决方案。

  1. 不选择 工具 > 兼容性视图设置 中的 在兼容性视图中显示Intranet站点
  2. 工具 > Internet 选项 > 安全 > 本地Intranet > 站点 中禁用 自动检测Intranet网络 并禁用导致网站被检测为本地Intranet的规则。

如何让某个子域名不以兼容性视图显示?

假设contoso.com这个域名下的多数站点都需要以兼容性视图显示,但其子域名:new.contoso.com在兼容性视图模式下不工作,需要以默认模式显示。这种问题有两种解决方案。

  1. 将contoso.com这个域名加入本地Intranet站点,这样contoso.com整个站点将以兼容性视图模式显示。然后将new.contoso.com加入受信任站点,这样new.contoso.com会被视为受信任站点,不会以兼容性视图模式显示。
  2. 在new.contoso.com的页面或者服务器上配置X-UA-Compatible meta标签或http返回头,指定其以较新的文档模式来显示页面。这样即使在兼容性视图模式下,该网站也会以开发者指定的文档模式显示。

参考资料