先给结论:当同一批已下线的旧链接在不同网络、不同设备上有时返回自定义404页、有时返回旧内容或空响应,最可能不是404页面本身写错了,而是多层缓存各自保存了不同时间点的响应。定位顺序应当是先固定一个可复现的请求,再逐层剥离缓存,最后才改页面。
假设某个旧栏目已经下线,源站配置为返回404加一段引导内容。你收到反馈:桌面浏览器看到的是新版404页,移动端却仍显示旧栏目列表,同事在公司网络下又得到空白页。这里有两种成立条件不同的解释。
两种解释的处理方向完全相反:前者要清理或迁移内容,后者只需处理缓存键与刷新策略。如果直接改404模板,很可能掩盖真正的问题。
关键证据是响应头与响应体的组合,而不是页面看起来像不像404。用一个固定URL发起请求,记录状态码、缓存相关响应头、内容长度和最后修改时间。
还要注意一个合理的替代解释:某些客户端或中间层会把404响应替换成自己的错误页。这种情况下你看到的“不同版本”并非来自你的源站,而是链路中某一跳的默认页。区分方法是看响应头是否由你的服务发出,以及内容长度是否与你的404页一致。
假设你选择先验证解释二。动作是:对同一URL分别发起源站直连请求和经过CDN的请求,两者都不带浏览器缓存,并记录完整响应头。结果会出现三种走向,直接决定下一步。
这个动作的价值在于:它把“页面不一致”拆成了可判定的分支,避免在错误的层反复修改。
旧内容或旧合作关系退出时,不必把所有相关URL都做成同一个404。对仍有搜索或用户价值的页面,更稳妥的做法是保留一个说明页或跳转到最接近的现存页面;对确实无价值的URL,再统一返回404。判断依据可以看该URL是否还有外部链接、是否仍出现在站点地图或内部导航中。
需要提醒的是,站点地图不保证收录,robots.txt的抓取限制也不等于可靠的索引移除。如果旧内容涉及索引清理,应分别核查不同搜索引擎的支持情况,而不是只依赖一种声明方式。
当多层缓存返回不同版本时,先固定请求、再逐层对比响应头,是比直接改404页面更可靠的第一步;确认问题所在层之后,再决定是刷新缓存、清理源站内容,还是调整404页面本身。