跳到主要内容

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 可能失效,因为资源未被缓存,无需验证。但某些实现仍会添加该指令以兼容旧版规范