事情本身不复杂,线索都在日志里。主题改版时图省事给全站加了 Cache-Control: public, max-age=2592000,上线新模板后老访客看到的还是旧样式,蜘蛛抓到的 HTML 里还引用着已删除的 CSS。
这类报错背后常见的原因有几处,逐个排除就行。一个月对 HTML 来说等于永久,浏览器不会回源确认。另一种情况是不同内容用了同一个头,CSS 和 HTML 混在一起设置。
还有一种情况,CDN 按源站头缓存,源站改了页面它也不来取。
先看响应头里的缓存策略
curl -sI https://www.example.com/about/ | grep -i cache-control
HTML 用短缓存加协商
location ~ \.(php|html)$ { add_header Cache-Control "public, max-age=300, must-revalidate"; }
静态资源再给长缓存
location ~* \.(css|js|png|webp)$ { expires 180d; add_header Cache-Control "public, immutable"; }
同一份数据我导出了两份,一份留底,一份拿来试。
怎么算真的好了,看的是同一批现象。HTML 响应头里 max-age 变为 300,静态资源仍是长缓存,F5 刷新能看到新版内容,蜘蛛抓到的 CSS 地址全部返回 200。
容易忽略的是,带指纹的静态资源可以永久缓存,HTML 永远别这么干,两者的过期时间必须分开配。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
