Cache-Control理解
- 请求/响应头,缓存控制字段,精确控制缓存策略
常见指令对比
- 常用的主要有
- no-cache、no-store、must-revalidate、max-aga
| 指令 | 作用 | 适用场景 | 是否缓存 | 是否需要验证 |
|---|---|---|---|---|
max-age=<秒> | 资源可缓存的最长时间(从请求时间开始计算) | 静态资源(如图片、JS/CSS文件),需长期缓存时使用(如max-age=31536000) | ✅ | 过期后需验证 |
s-maxage=<秒> | 覆盖max-age,仅对共享缓存(如CDN)生效 | CDN资源优化,适用于需要区分客户端和代理缓存策略的场景(如s-maxage=3600) | ✅ | 过期后需验证 |
no-cache | 可缓存,但每次使用前必须向服务器验证有效性(协商缓存) | 动态内容(如HTML页面),需保证内容实时性(如新闻页、用户数据) | ✅ | 必须验证 |
no-store | 禁止缓存任何内容,请求/响应均不存储 | 敏感数据(如登录页、支付信息),防止信息泄露 | ❌ | 不适用 |
must-revalidate | 缓存过期后必须重新验证,若服务器不可用则返回504错误 | 高一致性要求的资源(如API响应),确保缓存过期后立即更新 | ✅ | 过期后必须验证 |
public | 允许所有缓存(客户端、代理服务器)存储响应 | 公开资源(如网站Logo),无需用户身份验证的场景 | ✅ | 按max-age规则 |
private | 仅允许客户端缓存,禁止共享缓存(如CDN)存储 | 用户私有数据(如个人主页),避免共享缓存泄露隐私 | ✅ | 按max-age规则 |
immutable | 资源内容永不变,客户端可直接使用缓存而无需验证 | 带哈希指纹的静态资源(如main.abcd1234.js) | ✅ | 无需验证 |
no-transform | 禁止中间代理修改资源(如压缩图片、删除注释) | 需保持原始格式的资源(如加密文件、严格校验的JS/CSS) | 按其他指令 | 按其他指令 |
no-cache
- 定义:允许缓存存储响应,但每次使用前必须向服务器验证其有效性(通过
ETag或Last-Modified等机制)。 - 常见误解:虽然字面含义是“不缓存”,但实际是“缓存但需验证”。真正的“不缓存”需依赖
no-store。 - 实际行为:浏览器可能将资源缓存在内存中,但不会直接使用过期副本,而是强制发起验证请求
no-store
- 定义:完全禁止缓存存储响应内容,确保每次请求都从服务器获取最新内容
- 优先级:若与
no-cache同时存在,no-store会覆盖no-cache,因为资源根本不允许被缓存
must-revalidate
-
定义:要求缓存在资源过期后必须重新验证
-
典型场景:与
max-age配合使用,例如Cache-Control: max-age=600, must-revalidate表示资源在 10 分钟内有效,过期后需重新验证 -
组合矛盾:在
no-store存在时,must-revalidate可能失效,因为资源未被缓存,无需验证。但某些实现仍会添加该指令以兼容旧版规范