什么是缓存控制?你需要知道的一切

最后更新于 2025年10月20日
cache-control-blog-header.jpg

什么是缓存控制?

缓存控制是一种重要的超文本传输协议(HTTP)机制,允许开发者指示当用户浏览互联网时资源将如何被缓存。 没有它,浏览器缓存效率降低,导致加载时间变慢以及不必要的源站请求。

作为客户端与服务器之间交换的标头的一部分,缓存控制告诉浏览器和中间缓存何时可以存储资源以及在何种条件下可以重用。

通过定义诸如过期时间窗口或重新验证规则等指令,缓存控制让频繁访问的资源更接近用户,在需要时加快交付速度,同时仍然确保内容保持最新。

什么是浏览器缓存?

浏览器缓存是指网络浏览器临时存储网站资源以加快将来页面加载的过程。 首次访问时,图像、脚本和样式表等资源会被下载并保存到浏览器缓存中。在后续访问时,浏览器可以加载这些本地缓存的副本,而不是再次从服务器获取它们,从而减少延迟并改善用户体验。

缓存控制标头在控制浏览器缓存方面发挥关键作用。 它们定义资源可以在缓存中停留多长时间(使用诸如最大存活时间之类的指令),是否必须在重用前与服务器重新验证(无缓存),或者是否根本不应存储(无存储)。通过设置缓存控制策略,开发者确保缓存资源保持新鲜、高效提供,并符合预期的性能和安全要求。

缓存的资源不会无限期存储。每个资源都有一个时间限制,称为生存时间(TTL),超过该时间后资源即被视为过期。一旦TTL过期,浏览器必须从服务器请求新副本。TTL 和其他缓存规则通常由HTTP标头定义,例如缓存控制、过期时间或ETag,这些标头指示浏览器保留资源多长时间以及何时验证它们。

缓存控制标头在HTTP中如何工作?

要理解缓存控制标头的工作原理,首先必须了解HTTP标头是什么以及它们如何定义客户端与服务器之间的通信规则。
HTTP标头可以携带有关资源、客户端或服务器的信息,并定义数据传输、解释和缓存的规则。对于缓存,特定标头指示浏览器和中间商存储资源多长时间、何时重新验证以及如何高效提供资源。

广义上,HTTP缓存标头分为四类:

通用标头

通用标头适用于请求和响应,但不直接适用于消息内容。缓存控制是最主要的例子,指定资源的缓存规则。其他例子包括日期(标记消息发送时间)和连接(控制网络连接是否保持打开)。

请求标头

请求标头提供关于客户端请求或其能力的信息。在缓存中,诸如如果自某个时间之后已修改如果没有匹配之类的标头告诉服务器客户端有缓存版本,以及在何种条件下应更新它。

响应标头

响应标头包含服务器如何处理请求的细节。与缓存相关的例子包括缓存控制过期时间ETag,它们指导浏览器和代理是否可以缓存资源、缓存多长时间以及如何验证。

实体标头

实体标头描述内容本身,可以出现在请求或响应中。与缓存相关的例子包括内容长度(指定资源大小)和内容语言(指示目标受众)。

常见缓存控制指令详解

缓存控制标头包含关于缓存的信息——如何缓存、何时缓存、何时不缓存等。它们是由键值对组成的指令。键始终显示为“缓存控制”,值显示在右侧。例如,“缓存控制:最大存活时间”就是这样一条指令。

缓存控制指令可以是请求指令(由客户端使用)或响应指令(由服务器使用)。

以下是一些最常见的缓存控制指令:

缓存控制:最大存活时间

最大存活时间指令指定浏览器从发出请求起可以使用缓存的HTTP响应多长时间,以秒为单位。例如,最大存活时间=90表示缓存的响应在90秒内保持有效。设置缓存控制:最大存活时间=0告诉浏览器缓存资源立即过期,强制在重用前与服务器重新验证。这对于敏感或频繁更新的内容很有用。

对于图像、CSS 和 JavaScript 等静态文件,可以进行积极缓存。超过最大存活时间的缓存响应称为过期。

缓存控制:共享最大存活时间

共享最大存活时间与最大存活时间指令类似,但“共享”表示共享缓存。这与内容分发网络(CDN)和其他中间缓存有关。它会覆盖最大存活时间指令和存在时的过期时间标头字段。

共享最大存活时间与最大存活时间

共享最大存活时间与最大存活时间之间的关键区别在于其作用范围。共享最大存活时间仅适用于CDN或代理服务器等共享缓存,并在两者同时存在时优先于最大存活时间。这允许您控制资源在共享环境中的缓存时长,这对于防止敏感信息在这些中间缓存中存储过长时间非常重要。相比之下,最大存活时间主要用于控制单个用户设备上的缓存,提高性能并减少服务器负载。

缓存控制:无缓存

无缓存指令确保缓存的资源在未经源服务器检查前不能被重用。在使用URL的缓存版本之前,浏览器必须与其重新验证。这种行为有助于保持正确的身份验证,并确保提供资源的最新版本。

验证通常使用ETag标头执行,该标头允许服务器确认缓存的响应是否已更改。如果响应未更改,浏览器可以重用缓存的副本而无需再次下载。

缓存控制:无存储

无存储与无缓存类似,但更简单。使用此指令,HTTP响应不能被缓存和重用。相反,每次都必须请求资源,并从原始服务器下载完整响应。这在处理私人/个人信息或银行数据时尤其相关。

缓存控制:无转换

当资源存储在缓存服务器中时,中间代理有时会对这些资源进行修改。例如,它们可以更改图像和文件的格式以节省空间并提高性能。如果资源要保持与原始实体主体相同,这些修改可能会引发问题。无转换指令告诉中间缓存或代理不要进行任何此类修改,包括对响应主体、内容编码、内容范围或内容类型的编辑。

私有与公共缓存控制

公共缓存控制意味着资源可以被服务器与客户端之间的任何中间商(例如代理服务器)缓存,这通过缓存控制公共指令实现。私有缓存控制意味着资源只能被用户浏览器缓存,而不能被任何其他中间商缓存,因此开发者使用缓存控制私有指令。

从安全角度来看,私有缓存控制通常更好,因为它降低了敏感信息被非预期方缓存的风险。 例如,如果网页包含客户账户信息,将缓存控制标头设置为私有可确保此信息不会被其他用户可能使用的代理服务器缓存。

然而,对于某些资源,中间商可以安全地缓存而没有任何安全顾虑,例如公开可用的图像或CSS文件,公共缓存控制可能是必要的。在这种情况下,必须确保资源不敏感,并使用适当的缓存指令以防止未经授权访问敏感数据。

总之,私有与公共缓存控制的选择取决于所请求资源的性质以及应用程序的安全要求。 作为安全专家,理解这些差异并确保使用适当的缓存指令以最小化安全风险非常重要。

将CDN与缓存控制标头一起使用的好处

为了将缓存控制扩展到浏览器之外并改善跨地区交付,CDN将网络资源存储在更靠近最终用户的边缘位置。代理服务器无需为每个请求都从源站获取内容,而是临时缓存这些资源,并在后续访问时立即返回它们。

现代平台,如CDNetworks,通过精细的缓存策略和可编程的边缘逻辑增强缓存控制策略,实时适应内容行为。

请求图解.png

CDN以三种主要方式加强缓存控制:

1. 它们简化缓存策略管理

对于Web开发者来说,手动标记文件类型、调整和管理的所有不同缓存标头可能会让人不知所措。CDN通过用户友好的仪表板帮助他们简化缓存策略管理。管理员可以根据需要覆盖缓存标头指令,并在细粒度级别控制特定文件和文件类型。

2. 它们通过代理增强浏览器缓存

浏览器缓存本身会在首次访问后将网站的资源下载到本地驱动器。CDN可以通过代理加速这些本地存储资源的交付。
这有助于将内容更接近网站访问者,并确保向多个访问者提供单个缓存副本。它还允许快速交付资源,即使是首次访问者,其浏览器可能尚未缓存网站内容。

3. 它们可以使用机器学习自动化缓存

一些更高级的CDN能够使用机器学习(ML)自动化缓存控制。ML算法可以跟踪内容使用模式并缓存动态生成的内容和资源。

例如,一个随时间变化不大的HTML文件可以被标记为静态并分类为可缓存。它可以直接从CDN服务器提供,以实现更快的页面加载和响应能力。算法可以继续跟踪页面状态,并在发生变化时立即将其分类为动态。这优化了存储和缓存策略,并提高了内容交付速度。

缓存控制常见问题解答

缓存控制是缓存工作所必需的吗?

浏览器可能仍会使用默认启发式方法进行缓存,但如果没有明确的缓存控制标头,缓存行为是不可预测的。

缓存控制应该设置为什么?

理想的缓存控制设置取决于资源类型及其更改频率。对于静态资源(如图像或字体),请使用缓存控制:最大存活时间不可变进行长期缓存。对于动态或敏感内容,请使用缓存控制:无缓存缓存控制:私有以确保新鲜度和安全性。

缓存控制在没有CDN的情况下工作吗?

是的,它控制浏览器缓存。CDN将相同的指令扩展到边缘服务器,以实现更快的全球交付。

动态内容或个性化页面缓存安全吗?

是的,使用正确的缓存策略。您可以使用无存储、私有或最大存活时间等指令绕过私人内容的缓存,同时缓存公共组件。CDNetworks等平台支持动态内容加速,通过边缘逻辑保持速度和安全性。

免费试用
CDNetworks

我们的多数产品都有14天的免费试用。无需信用卡。

探索更多

云安全

为什么每个企业都需要现代 DDoS 防护服务?

现代 DDoS 攻击速度更快、更智能,也更难阻止。每个企业都需要一套现代化的 DDoS 防护服务,以应对不断演变的威胁,确保应用程序持续在线。

了解更多 »
云安全

CDNetworks AI 安全:让企业从容应对日益复杂的威胁

CDNetworks 将 AI 深植于安全架构之中,让企业轻松应对各种挑战,保持安全稳健。

了解更多 »