add_header Cache-Control 'no-store' always;
# CDN 侧配置 404 不参与缓存
curl -sI https://www.example.com/new-post | head -1

文章发布十分钟了打开还是 404,源站直接访问却完全正常,只有走 CDN 的那个地址不对,手动清一次缓存就好了。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,CDN 把 404 也当成可以缓存的响应,边缘节点上存了一份,后面的请求就被直接挡在节点上,根本没有回源,新内容自然出不来只能等过期。

围绕「404 被 CDN 缓存」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:在 CDN 的缓存规则里面明确写清楚,404 和 5xx 这两个状态码不参与缓存;源站给错误页也加上 no-store 响应头,两边做一层双保险;发布完成之后对目标地址单独刷新一次,不要只刷首页。

改完只确认一件事:新文章第一次访问就应该返回 200 状态,刷新几次也不会再出现 404。

作者 9823189