curl -sI https://example.com/api/article/1 | grep -iE 'cache-control|age' # 期望 s-maxage=60 且 Age 不超过 60
接口配了 Cache-Control: public, max-age=3600, s-maxage=60,本意是 CDN 一分钟、浏览器一小时,结果文章更新后浏览器端一小时都不刷新。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,max-age 是给浏览器和共享缓存共用的,s-maxage 只覆盖共享缓存。浏览器不看 s-maxage,按 3600 存满一小时。两个值差得越大,两端看到的内容越不一致。
围绕「s-maxage 与 max-age」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
处理上按这个顺序:浏览器端也想要短缓存就把 max-age 一起改小;需要浏览器强缓存时给静态资源加内容哈希;接口类响应统一用 s-maxage 加 no-cache 组合;验证时分别看 CDN 的 Age 和浏览器的缓存时间。
改完只确认一件事:CDN 一分钟回源一次 浏览器拿到的新内容时间差不超过一分钟 两端不再各存各的。
