404 not found 的意思是服务器能收到请求,但找不到对应的资源;它本身不等于源站故障。当源站直连返回 200、而经过边缘节点后返回 404 时,问题通常出在边缘缓存、回源路径或节点配置上。此时最有价值的证据是能同时证明“源站当时正常”和“边缘节点当时确实返回了 404”的成对记录,而不是单独一份状态码日志。
假设某个旧栏目需要退出,团队把源站上的目录整体移走,只保留少量仍然有价值的页面,并在源站配置里让其余路径返回 404。上线后有人反馈:直接访问源站 IP 加 Host 头,目标页面返回 200;通过正式域名访问,同一路径却返回 404。这个矛盾就是本篇要处理的场景,以下步骤均为假设推演,不是真实项目记录。
第一步不是立刻改配置,而是先固定现场。因为边缘节点会缓存响应,一旦你反复刷新,可能把异常状态覆盖掉,后续再查就只剩“现在是什么”,而丢失“当时是什么”。
核心思路是让同一路径、同一时间窗口内,源站直连和边缘返回的结果可以并排比对。可保留的内容包括:
Last-Modified、ETag 这类能标识资源版本的字段。Age、Cache-Control、Via 以及节点自己附加的标识字段。如果源站返回 200 而边缘返回 404,且边缘响应里带有较大的 Age,说明边缘很可能仍在使用一份旧的缓存结果。这是区分“回源失败”和“缓存未刷新”的关键线索。反过来,如果边缘响应没有 Age、也没有缓存命中痕迹,那更可能是回源路径或节点转发规则的问题。
仅凭浏览器里看到的响应头,无法判断异常是发生在一个节点还是全部节点。可操作的动作是:分别从至少两个不同网络出口请求同一路径,记录各自返回的状态码和节点标识。如果只有一个出口异常,问题更可能局限在单个节点或某条回源链路;如果多个出口一致异常,则要怀疑全局配置或源站对边缘回源请求的处理方式。
同时保留一份异常发生时的边缘配置快照,重点是回源地址、回源 Host、路径重写规则和缓存键的组成。很多“源站正常、边缘 404”的情况,根源是缓存键里包含了某个会变化的维度,或者路径重写把请求指向了源站上并不存在的地址。这类原因和资源是否真的被删除无关,靠看状态码本身分辨不出来。
边缘请求量突然下降、某个路径的抓取记录归零,都不足以证明处理正确。它们还有别的合理解释:可能是缓存命中后不再回源,可能是监控采样口径变化,也可能是请求被转移到了另一个节点。同理,源站直连返回 200 也不能证明边缘一定应该返回 200,因为边缘可能按自己的规则改写了路径或 Host。
还要注意,robots.txt 的抓取限制不等于索引移除,站点地图也不保证收录,这些和边缘 404 的排查是两条线,不要混在一起当作证据。如果异常路径同时被搜索引擎抓取过,应在确认边缘行为稳定后再单独评估索引影响,而不是在证据不全时先改抓取规则。
把上面的材料放在一起后,通常会出现三种可区分的情况:
无论走哪条路,动作完成后都要重新采集同一组成对证据。只有源站和边缘在相同条件下返回一致结果,才能说明这次异常被处理到位;否则保留的旧证据仍然有效,下一步应继续沿未排除的那条线索查下去。