如何在 Internet Explorer 中阻止缓存

警告

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

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

原始产品版本: Ie
原始 KB 编号: 234067

摘要

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

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

Expiration 和 Expires 标头

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

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

预期不会更改的页面应标有大约一年的到期日期。

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

  • 使用“后退”和“转发”按钮访问导航历史记录时。
  • 当浏览器处于脱机模式时。

Cache-Control 标头

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

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

杂注:No-Cache 标头

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

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

HTTP-EQUIV META 标记

HTML 页面允许使用 META 标记的特殊 HTTP-EQUIV 形式,以指定 HTML 文档中的特定 HTTP 标头。 下面是一个简短的示例 HTML 页面,它同时使用杂注:no-cache 和 Expires: -1:

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

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

Cache-Control 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 获取技术支持帮助之前,分步查看此方便的清单:

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

另请参阅