HTTP 缓存 · 年龄实验台

响应到了浏览器,年龄会从零开始吗?

不会。先前缓存的停留、请求往返和本层驻留都可能算进年龄。调整左侧响应头,观察同一份响应为什么能被 CDN 直接复用,却被浏览器判为过期。

唯一判定线 新鲜寿命 > 当前年龄 → 可直接复用
表面年龄
max(0, 收到 − Date)
90s
修正 Age
上游 Age + 延迟
92s
修正初始年龄
取前两者较大值
92s
当前年龄
初始年龄 + 驻留
112s

年龄和寿命在同一条尺上

刻度终点 660 秒
0s
Date 12:00:00
90s
上游估算 Age 响应头
92s
本层收到 12:01:30
112s
现在 驻留 20 秒
浏览器私有缓存
CDN共享缓存

同一响应,两层各自裁决

年龄相同,采用的寿命可能不同

浏览器私有缓存

直接复用
当前年龄
112s
新鲜寿命
120s
剩余时间
8s

采用 max-age;忽略只约束共享缓存的 s-maxage。

CDN 共享缓存

直接复用
当前年龄
112s
新鲜寿命
600s
剩余时间
488s

采用 s-maxage;它覆盖共享缓存看到的 max-age 与 Expires。

这些字段“打架”时,谁让路

书写顺序不会改变优先级
    浏览器max-age → Expires − Date → 无明确寿命 CDNs-maxage → max-age → Expires − Date → 无明确寿命