Age 表示响应在缓存里待了多久
Age 由缓存(代理、CDN、网关)添加,表示该响应在到达客户端之前已经在共享缓存中存放了多少秒。它是判断「有没有命中缓存」最直接的证据:新鲜度计算把 Age 与 Date 一起和 max-age 比较,Age 越大说明拿到的是越旧的副本。Age 为 0 或缺失通常意味着刚刚回源。
基本信息
| 方向 | 响应头,由缓存生成 |
|---|---|
| 规范 | RFC 9111 §5.1 |
| 取值 | 非负整数,单位为秒 |
| 作用 | 参与新鲜度判断:当前年龄超过 max-age 即视为陈旧 |
| 配套头 | Cache-Control、Date、Expires、X-Cache 等命中标记 |
结合其它头一起读
| 响应头 | 含义 | 判读要点 |
|---|---|---|
| Age: 0 | 刚回到源站或刚写入缓存 | 通常伴随 X-Cache: MISS |
| Age 接近 max-age | 缓存副本即将过期 | 下次请求大概率回源 |
| s-maxage | 共享缓存的最大新鲜期 | CDN 优先于 max-age |
| X-Cache | 厂商自定义命中标记 | HIT 与 MISS 是排查缓存命中的快车道 |
判断命中与新鲜度
判断命中与新鲜度
curl -sI https://cdn.example.com/img.png | grep -iE '^(age|cache-control|date|x-cache|expires)'
# age: 120
# cache-control: max-age=3600
# x-cache: HIT
# 说明副本已存在 120 秒,距离过期还有 3480 秒
curl -sI https://cdn.example.com/img.png?nocache=1 | grep -i x-cache # 换 URL 验证回源行为典型使用场景
- 确认 CDN 是否真的命中,避免以为配置生效却一直回源
- 排查「内容不更新」:Age 很大说明拿到的是较旧副本,结合 max-age 与刷新策略分析
- 容量评估:命中率低会直接抬高源站压力与成本
- 验证刷新接口是否生效:刷新后 Age 应重置
Age 很大说明命中了较老的副本,排查「内容不更新」时要结合 s-maxage 一起看:源站的 max-age 与 CDN 的 s-maxage 不一致时,实际生效的是共享缓存那一档。
私有缓存(浏览器)不会发送 Age,看到 Age 就意味着链路中间存在共享缓存;同一响应在不同地区可能命中不同节点,Age 表现会不一致。
计算新鲜度时要连 Date 一起看:新鲜度寿命减去响应从源站到缓存已经消耗的时间,才是还剩多少可缓存的秒数,只比较 Age 与 max-age 会算错边界。