响应头 Cache-Status 显示 cdn; hit 和 x-cache: Hit 同时出现,页面数据却是十分钟前的,源站日志显示八分钟前有过一次回源。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
curl -sI https://example.com/page | grep -iE 'cache-status|age|x-cache|date'
链路上有多层缓存,hit 只说明当前这层命中了,不表示内容新。CDN 命中的可能是它自己存的旧副本,浏览器命中的又是 CDN 的旧响应。每一层的 TTL 不一样,最外面那层最长。这一点先确认清楚,后面就不用反复试。
「Cache-Status 排查」这类改动最怕改一半,回滚脚本先准备好,再动生产。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
具体做法是,逐层看 Age 和 Cache-Status 判断命中的位置;对比源站、CDN、浏览器三处的时间戳;把 CDN 的 TTL 调到不超过源站;验证时先清浏览器缓存再请求 排除本地干扰。
改完照着核一遍,三层缓存的时间差不超过设定值 页面内容与源站一致。
