读懂缓存状态响应头

HIT、MISS、EXPIRED、STALE、REVALIDATED、BYPASS——这些状态说的是不同的事,混着看会得出错误结论。

6 分钟缓存与命中
读懂缓存状态响应头

要点

MISS 是「没有副本」,EXPIRED 是「有副本但过期」,BYPASS 是「规则明确要求不缓存」。三者的修复方向完全不同。

本文目录
  1. 01各状态的含义
  2. 02各家的响应头名字不一样
  3. 03排查顺序

各状态的含义

状态含义通常该查什么
HIT边缘有新鲜副本,直接返回正常
MISS边缘没有副本,已回源是否首次请求,或 TTL 太短
EXPIRED有副本但已过期,回源验证TTL 设置是否合理
STALE返回了过期副本stale-while-revalidate 生效中
REVALIDATED回源验证后发现未改动ETag 生效,省了正文流量
BYPASS规则要求跳过缓存检查缓存规则与 Cache-Control
DYNAMIC被判定为不可缓存通常是 Set-Cookie 或 no-store

各家的响应头名字不一样

X-Cache: HIT
CF-Cache-Status: HIT
X-Cache-Status: HIT
Cache-Status: "cdn"; hit          # RFC 9211 标准写法

RFC 9211 定义了标准的 Cache-Status 响应头,新厂商逐渐在支持,但自有的 X- 头仍然更常见。看自己站点时以厂商文档为准。

排查顺序

先分清 MISS 和 BYPASS

MISS 说明缓存机制在工作、只是这次没有副本,多请求几次就会变 HIT。BYPASS/DYNAMIC 说明这个资源根本没在被缓存——再请求一万次也不会变 HIT。看到 BYPASS 就该去查缓存规则和 Set-Cookie,而不是纠结命中率数字。

  • 同一 URL 连续请求两次:第二次仍是 MISS 说明副本没被存下来;
  • 检查响应里有没有 Set-Cookie——它会让多数 CDN 直接判定不可缓存;
  • 检查 Cache-Control 里有没有 private / no-store;
  • 检查有没有意外的 Vary。

在你的网站验证

边缘核验从多个地区读取你的缓存状态响应头