HTTP Cache-Control 的作用

Cache-Control 是 HTTP 协议中用于控制缓存行为的重要头部字段,它定义了资源在客户端(如浏览器)和代理服务器(如 CDN)中如何被缓存以及缓存的有效期。

主要作用

  1. 控制缓存存储:指定资源是否可以被缓存
  2. 设置缓存时间:定义资源在缓存中的有效期限
  3. 缓存验证策略:规定缓存过期后是否需要重新验证

常用指令

指令 说明
max-age=<seconds> 资源被视为新鲜的最长时间(相对时间)
no-cache 缓存前必须先验证(实际可以缓存,但每次使用需重新验证)
no-store 完全禁止缓存(包括不存储到磁盘)
public 允许任何中间节点(CDN、代理)缓存
private 仅允许浏览器缓存,不允许中间节点缓存
must-revalidate 过期后必须重新验证,不能使用过期资源

没有 Cache-Control 时的默认缓存行为

当响应头中没有 Cache-Control 时,浏览器的缓存行为取决于 Expires 头启发式缓存

1. 如果有 Expires 头

浏览器使用 Expires 头指定的绝对过期时间。

2. 如果既没有 Cache-Control 也没有 Expires

浏览器会使用启发式缓存(Heuristic Caching),根据以下因素判断:

  • Last-Modified 头:根据资源的最后修改时间计算一个缓存时间
  • 常见的默认缓存时间:通常为上次修改时间到当前时间的 10%(即 (Date - Last-Modified) × 0.1)
  • 不同的浏览器实现略有差异,一般范围在 10% 到 50% 之间

3. 典型浏览器的默认行为

场景 默认缓存时间
完全无缓存头 启发式计算,通常较短(几分钟到几小时不等)
静态资源(图片、CSS、JS) 往往被启发式缓存,具体取决于服务器配置
HTML 文档 通常不缓存或缓存极短时间
通过 HTTPS 且无缓存头 更保守,部分浏览器默认不缓存

4. 实际示例

假设一个资源:

  • Last-Modified: 2024-01-01
  • 当前请求时间:2024-01-10(间隔 9 天)

启发式缓存可能会计算出 (9天 × 10%) ≈ 21.6小时 作为新鲜期。


最佳实践建议

为了避免不确定性,始终显式设置 Cache-Control

# 静态资源(带版本号的文件)
Cache-Control: public, max-age=31536000, immutable

# HTML 页面(需要及时更新)
Cache-Control: no-cache

# 敏感数据
Cache-Control: no-store

这样可以确保缓存行为符合预期,避免因默认启发式缓存导致的问题。

文档更新时间: 2026-03-28 02:09   作者:月影鹏鹏
IT运维支持-AIWALY-月影工作室