curl -sI http://127.0.0.1/static/app.css | grep -iE 'expires|cache-control'
# 期望只剩 Cache-Control: public, max-age=600

响应同时带 Expires: Thu, 01 Jan 2020 00:00:00 GMT 和 Cache-Control: max-age=600,浏览器每次都回源,max-age 完全没起作用。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,两个头都在时 Cache-Control 的优先级更高,max-age 应该生效。这里的问题是 Expires 已经过期,中间还有一层代理只认 Expires,直接把响应判成 stale。两层缓存判断标准不一致,表现就像 max-age 没写。

「Expires 与 max-age」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

处理上按这个顺序:只保留 Cache-Control 删掉 Expires;中间代理上确认没有自己补 Expires;用浏览器 Network 的缓存状态确认命中的是哪一层;对静态资源统一加版本号 减少对时间的依赖。

改完只确认一件事:响应头里不再出现 Expires 十分钟内重复访问走缓存 Network 显示 from disk cache。

作者 9823189