先给结论:当源站返回 301 正常、边缘节点却返回 200、302、404 或旧内容时,最该保留的不是一张截图,而是能区分“边缘缓存了旧响应”与“边缘配置覆盖了源站规则”的证据链。至少要留下请求时间、完整 URL、响应头、节点标识、源站对照结果,以及这些证据的采集方式。缺了其中任何一项,后续动作都只能靠猜。
边缘节点异常最常见的两种原因是:
这两者的处理方向完全不同:前者清缓存即可验证,后者必须改配置。判断依据不在状态码本身,而在“源站有没有被请求到”。
保留完整响应头,而不是只看状态码。重点看这些字段是否存在、值是什么:
Age:大于 0 通常说明响应来自缓存层;为 0 或缺失则更可能来自回源。Cache-Control、Expires:判断旧响应为何还能被继续使用。Via、X-Cache、CF-Cache-Status 一类字段:不同服务商命名不同,看到就记下原值,不要自行翻译成结论。Location:301 的目标地址是否与源站一致。若边缘返回的 Location 与源站不同,配置覆盖的嫌疑更大。Server、X-Served-By:用于标记响应由哪一层产生。这些字段的名称和含义因服务商而异,必须以实际抓到的原文为准,不要套用别家的字段名去推断。
在尽可能接近的时间窗内,用同样的 URL 和请求方法直接访问源站,记录源站返回的状态码、Location 和响应头。若源站稳定返回 301,而边缘返回 200 且带 Age,缓存旧响应的解释成立;若边缘返回的 Location 与源站不同,或边缘压根没有回源痕迹,配置覆盖更可能。
单次请求只能证明一个节点在一个时刻的表现。保留多个节点、多个时间点的结果,才能判断是全局配置问题还是局部缓存问题。记录时至少包含:请求发起时间(含时区)、解析到的节点 IP 或节点标识、请求所用的 URL(含协议和查询串)。
假设旧栏目 /old/ 已改为 301 指向 /new/。源站直连返回 301,但边缘返回 200 并带有 Age: 86400,Location 缺失。
此时先做清除缓存这一动作,再立刻用同一 URL、同一节点复测。如果复测变成 301,说明是缓存旧响应,下一步应检查旧响应的缓存策略为何允许长期留存,并确认其他旧路径是否有同样问题。如果清除后仍是 200,或 Location 与源站不一致,就应转向检查边缘的重写与路由规则,而不是继续清缓存。这个动作的价值在于:它把两种解释压缩成一次可复现的对照,结果直接决定排查方向。
curl -I 或等效方式抓取响应头,保存原始输出,不要只抄状态码。需要提醒的是,抓取量或某个日志字段归零,并不能单独证明边缘已经恢复正常,它也可能是采集方式变化、日志延迟或过滤规则导致的。判断是否恢复,仍要回到源站与边缘的状态码、Location 和响应头是否一致。
旧内容、旧系统或旧合作关系退出时,301 往往要长期保留,因为外部链接和用户书签不会同步消失。因此边缘异常的证据应保留到确认所有相关路径在源站与边缘表现一致为止,而不是清一次缓存就结束。若旧路径数量较多,建议按路径分组抽样,每组保留一份完整证据,并注明抽样依据,这样后续复查时不必从头再来。
把这些证据整理成可复查的记录,比任何一次“看起来正常了”的目测都更有用,因为下一次异常出现时,你需要的正是上一次的对照基线。