HTTP Cache-Control 的作用
Cache-Control 是 HTTP 协议中用于控制缓存行为的重要头部字段,它定义了资源在客户端(如浏览器)和代理服务器(如 CDN)中如何被缓存以及缓存的有效期。
主要作用
- 控制缓存存储:指定资源是否可以被缓存
- 设置缓存时间:定义资源在缓存中的有效期限
- 缓存验证策略:规定缓存过期后是否需要重新验证
常用指令
| 指令 | 说明 |
|---|---|
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 作者:月影鹏鹏