先给结论:多层缓存下出现“同一URL有时404、有时200”,通常不是404页面设置本身随机失效,而是不同缓存层各自保存了不同版本的响应,且没有统一以源站状态码为准。定位的关键动作是逐层对比响应头中的缓存标识与源站返回,而不是继续改404模板。
假设一个情境:站点更新了路由规则,源站对已删除的旧路径返回404并渲染自定义404页面。用户反馈同一链接刷新几次结果不同,有时看到404页,有时看到旧内容。此时需要先区分两类不一致:
这两类的排查路径不同。状态码不一致说明缓存层保存了不同响应;内容不一致则更可能是404模板被单独缓存。先打开浏览器开发者工具的Network面板,记录每次请求的状态码、Age、Cache-Control、X-Cache或类似回源标识,再决定往哪层查。
多层缓存一般包括浏览器缓存、CDN边缘节点、反向代理或应用层缓存。定位时按请求路径由外向内推进:
如果源站返回404,而边缘节点返回200,问题就在边缘缓存策略;如果各层状态码一致但404页面内容不同,则要检查404模板是否被当作静态资源缓存。这个判断直接决定下一步是改缓存规则还是改页面输出头。
常见遗漏条件是:缓存键只包含URL,不包含响应状态码或Vary维度。这样当源站先返回200、后返回404时,缓存层可能把先到的响应长期保留,后续请求继续命中旧版本。需要确认:
Cache-Control。一个可执行动作是:对返回404的路径临时设置较短的缓存时间或不缓存,再重新请求并观察各层状态码是否收敛。如果收敛,说明此前是缓存键设计问题,下一步应调整缓存策略而非继续修改404页面。
假设源站确实已删除某路径,但CDN仍返回200。可以构造对照:
如果随机路径返回404,而目标路径返回200,说明目标路径被某层缓存单独保留;如果两者都返回200,说明404处理链路整体未生效。这个对照能避免把缓存问题误判为404页面设置错误。
调整缓存规则或404输出头后,需要从多层分别验证:源站、CDN边缘、浏览器端各请求若干次,确认同一URL的状态码稳定一致。注意,请求量归零或某层不再出现404,并不能单独证明处理正确,也可能是缓存被清空或请求绕过了该层。因此验证时要保留回源标识,确认每次请求确实经过目标缓存层。只有各层对同一URL返回相同状态码和相同404页面版本,才能认为一致性问题已定位并解决。