如何在 Internet Explorer 中防止缓存

警告

已停用、不受支持的 Internet Explorer 11 桌面应用程序在某些版本的 Windows 10 上已通过 Microsoft Edge 更新永久禁用。 有关详细信息,请参阅 Internet Explorer 11 桌面应用停用常见问题解答

本文介绍如何使用 HTTP 标头来控制 Internet Explorer 中网页的缓存。

原始产品版本: Internet Explorer
原始 KB 数: 234067

总结

可以使用 Microsoft Internet Information Server (IIS)在特定 Active Server 页面(ASP)页面的开头使用以下脚本轻松标记高度易失或敏感页面:

<% Response.CacheControl = "no-cache" %>
<% Response.AddHeader "Pragma", "no-cache" %>
<% Response.Expires = -1 %>

过期和过期标头

强烈建议所有 Web 服务器对所有网页的过期使用方案。 Web 服务器不通过 HTTP Expires 响应标头为返回请求客户端的每个资源提供过期信息是错误的。 大多数浏览器和中间代理今天都尊重此过期信息,并使用它来提高通过网络通信的效率。

始终使用 Expires 标头指定客户端需要更新服务器上的特定文件时最合理的时间。 定期更新页面时,下一个更新周期是最有效的响应。 例如,以每天凌晨 5 点更新的 Internet 上的每日新闻页面为例。此新闻页的 Web 服务器应返回一个“过期”标头,其值为第二天上午 5 点。 完成后,浏览器无需再次联系 Web 服务器,直到页面发生更改。

预计不会更改的页面应标记为到期日期约为一年。

在许多情况下,Web 服务器在服务器上有一个或多个易失性页面,其中包含可能立即更改的信息。 这些页面应由服务器标记,其值为“-1”的 Expires 标头。 对于用户未来的请求,Internet Explorer 通常通过条件 If-Modified-Since 请求联系 Web 服务器以更新该页面。 但是,页面保留在磁盘缓存中(临时 Internet 文件)。 页面在适当情况下使用,无需联系远程 Web 服务器,例如:

  • 当使用 BACK 和 FORWARD 按钮访问导航历史记录时。
  • 当浏览器处于脱机模式时。

Cache-Control 标头

但是,某些页面非常易失或敏感,因此不需要磁盘缓存。 为此,Internet Explorer 支持 HTTP 1.1 缓存控制标头。 当 HTTP 1.1 服务器指定无缓存值时,此标头可防止特定 Web 资源的所有缓存。

在浏览器可以重新协调 Web 服务器之前,无法访问缓存中保留的页面。 因此,服务器应谨慎使用 Cache-Control 标头。 在大多数情况下,首选使用 Expires:-1。

杂注:No-Cache 标头

遗憾的是,旧版 HTTP 1.0 服务器无法使用 Cache-Control 标头。 为了向后兼容 HTTP 1.0 服务器,Internet Explorer 支持使用 HTTP Pragma:no-cache 标头。 如果客户端通过安全连接(https://)与服务器通信,并且服务器返回 Pragma:无缓存标头和响应,则 Internet Explorer 不会缓存响应。

但是,Pragma:无缓存标头不是出于此目的。 根据 HTTP 1.0 和 1.1 规范,此标头仅在请求上下文中定义,而不是响应。 它适用于可能阻止某些重要请求到达目标 Web 服务器的代理服务器。 对于将来的应用程序,Cache-Control 标头是控制缓存的正确方法。

HTTP-EQUIV META 标记

HTML 页面允许使用 META 标记的特殊 HTTP-EQUIV 形式,该标记指定 HTML 文档中的特定 HTTP 标头。 下面是使用 Pragma:no-cache 和 Expires: -1 的简短示例 HTML 页:

<HTML>
    <HEAD>
        <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
        <META HTTP-EQUIV="Expires" CONTENT="-1">
    </HEAD>
<BODY>
</BODY>
</HTML>

杂注:仅当通过安全连接使用时,无缓存才会阻止缓存。 Pragma:no-cache META 标记的处理方式与 Expires 相同:-1(如果在非安全页中使用)。 页面将被缓存,但标记为立即过期。

缓存控制 META HTTP-EQUIV 标记将被忽略,在 Internet Explorer 版本 4 或 5 中不起作用。 若要使用 Cache-Control,必须使用 HTTP 标头指定此标头,如上面的 Cache-Control 部分所述。

注意

使用标准 HTTP 标头比 META 标记更优先。 META 标记通常必须出现在 HTML HEAD 部分的顶部。 Pragma HTTP-EQUIV META 标记至少有一个已知问题。

用于缓存的服务器选项

当需要在非 ASP 页面上使用 Cache-Control 标头时,可能需要使用服务器配置中的选项自动添加此标头。 有关将 HTTP 标头添加到特定目录的服务器响应的过程,请参阅服务器文档。 例如,在 IIS 4 中,请执行以下步骤:

  1. 启动 IIS 管理器。
  2. 在计算机和服务树中,打开默认 Web 服务器或有问题的 Web 服务器。 查找包含需要 Cache-Control 标头的内容的目录。
  3. 打开该目录的 “属性 ”对话框。
  4. 选择“HTTP 标头”选项卡。
  5. 选择 “自定义 HTTP 标头”组中的“添加 ”按钮,并为标头值添加 Cache-Control,并为标头值添加无缓存。

在整个 Web 服务器上全局使用此标头并不是一个好主意。 将其用途限制为绝对不能缓存在客户端上的内容。

问题清单

如果已应用本文中的技术,并且缓存和 Internet Explorer 仍有问题,请在联系Microsoft获取技术支持帮助之前分步查看此方便的清单:

  • 是否通过 ASP Response.CacheControl 属性或返回的 HTTP 标头使用 Cache-Control 标头? 这是真正防止在 Internet Explorer 中缓存的唯一方法。
  • 你使用的是 Internet Explorer 4.01 Service Pack 2 或更高版本吗? 无法完全防止在早期版本的浏览器中缓存。
  • 是否已仔细检查 Web 服务器是否已启用 HTTP 1.1,是否向 Internet Explorer 返回 HTTP 1.1 响应? HTTP 1.0 响应中的 Cache-Control 标头无效。
  • 如果在服务器端使用 CGI/ISAPI/Servlet,是否完全遵循 HTTP 1.1 规范,尤其是关于 HTTP 标头的 CRLF 终止? 为了提高性能,Internet Explorer 通常对违反 HTTP 1.1 规范的响应表示无情。 它通常会导致忽略的标头或意外服务器错误的报告。
  • HTTP 标头拼写正确吗?

另请参阅