兼容性视图是 IE 最常用的向下兼容方案,它可以通过兼容性视图设置、组策略、本地 Intranet 站点来实现。巧妙地利用这些配置可以控制不同的子域名有些在兼容性视图中显示,有些在默认模式中显示。
兼容性视图概述
在兼容性视图模式下:
- IE 发给服务器的 User-Agent 会包含“MSIE 7.0”令牌以模拟自己是 IE7。
- 在选择默认文档模式时,会模拟 IE7 的选择行为,即:如果页面声明了**<!DOCTYPE>**,则使用 IE7 标准文档模式,不然则使用 IE5 Quirks 文档模式。
更多信息可阅读:企业 IE11 迁移指南:详解浏览器模式、文档模式、User-Agent 和 X-UA-Compatible
使用兼容性视图
以下是所有能够使网站以兼容性视图显示的方式。
- 手动添加网站到兼容性视图设置。
- Microsoft 兼容性列表中的站点。
- IE 组策略兼容性视图设置中配置的站点。
- 本地 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 站点列表,IE 也会以一定的条件自动判断某个站点是否为地 Intranet 站点。
手动添加
可以通过:工具 > Internet 选项 > 安全 > 本地 Intranet > 站点 > 高级 添加某个站点到本地 Intranet。
组策略
我们可以通过下列组策略设置将指定的域名添加到本地 Intranet。
管理模板 > Windows 组件 > Internet Explorer > Internet Control Panel > 安全页:站点到区域分配列表
这个设置包含一个站点列表,可以给指定的域名按以下规则赋值。
- 1: 本地 Intranet
- 2: 受信任的站点
- 3: Internet
- 4: 受限制的站点
如下图所示,将 windows.microsoft.com 添加到本地 Intranet。
如果使用了该组策略设置后,用户之前自己手动添加的本地 Intranet 站点就不再生效了,并且用户无法从 IE 设置中更改这个列表的设置。如下图所示,用户可以查看当前列表,但添加、删除按钮是禁用的。
自动检测
除了通过以上两种方法指定某个站点为 Intranet 站点,IE 还会通过以下 4 个规则自动检测一个站点是否为本地 Intranet。
如果站点域名中不包含英文句号:“.”,那么这个站点会被识别为本地 Intranet 站点,如:http://mysite。
如果在 Internet 选项 > 连接 > 局域网设置 中指定使用某个代理服务器并在高级代理设置中将站点加入例外,那么该站点会被识别为本地 Intranet 站点。
如上图所示,用户指定使用代理服务器:corpproxy:80,但 windows.microsoft.com 被加入了例外列表,即访问 windows.microsoft.com 时不会使用代理服务器,这种情况下 windows.microsoft.com 会被识别为本地 Intranet 站点。
如果在 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 站点。
如果 URL 是一个 UNC 网络路径,那么这个站点会被识别为本地 Intranet 站点,如:\\tsclient\c\www\index.html。
上面四个规则可以通过 工具 > Internet 选项 > 安全 > 本地 Intranet > 站点 下的三个选项开启或关闭。
- 包括没有列在其他区域的所有本地(Intranet)站点,该选项可以控制第一条规则。
- 包括所有不使用代理服务器的站点,该选项可以控制第二和第三条规则。
- 包括所有网络路径(UNC),该选项可以控制第四条规则。
自动检测仅在加域的机器上工作,一台没有加域的机器,http://localhost 是不会被识别为本地 Intranet 站点的。如果要使未加域的机器应用上述规则,需要取消勾选 自动检测 Intranet 网络 选项,然后手动勾选需要应用的规则。
常见问题
为何一个受信任站点也会以兼容性视图显示?
如果一个受信任站点以兼容性视图显示,有以下四种可能。
- 用户通过兼容性视图设置中添加了该站点。
- IT 管理员在组策略的兼容性设置中添加了该站点。
- Microsoft 兼容性列表包含该站点并指定其以兼容性视图模式显示。
- 该站点满足自动检测本地 Intranet 站点的条件。
前三点都比较容易排查,第四点往往会被忽视。假设在一台域内的机器上,用户指定了 http://localhost 为受信任站点,这种情况下 http://localhost 依然会以兼容性视图显示因为其满足被检测为本地 Intranet 的条件。如果想解决这个问题,可以考虑以下解决方案。
不选择 工具 > 兼容性视图设置 中的 在兼容性视图中显示 Intranet 站点。
在 工具 > Internet 选项 > 安全 > 本地 Intranet > 站点 中禁用 自动检测 Intranet 网络 并禁用导致网站被检测为本地 Intranet 的规则。
如何让某个子域名不以兼容性视图显示?
假设 contoso.com 这个域名下的多数站点都需要以兼容性视图显示,但其子域名:new.contoso.com 在兼容性视图模式下不工作,需要以默认模式显示。这种问题有两种解决方案。
- 将 contoso.com 这个域名加入本地 Intranet 站点,这样 contoso.com 整个站点将以兼容性视图模式显示。然后将 new.contoso.com 加入受信任站点,这样 new.contoso.com 会被视为受信任站点,不会以兼容性视图模式显示。
- 在 new.contoso.com 的页面或者服务器上配置 X-UA-Compatible meta 标签或 http 返回头,指定其以较新的文档模式来显示页面。这样即使在兼容性视图模式下,该网站也会以开发者指定的文档模式显示。