先给结论:异常恢复后看到的“正常”,可能只是缓存副本到期前的旧结果,也可能是源站真的修好了。区分方法不是反复刷新页面,而是对同一URL分别检查源站响应、缓存层响应和抓取端最终拿到的内容,三者一致才算真正修复;只要其中一层仍返回旧结果,就应继续按缓存问题处理。
假设你处理的是一个此前返回404、现在浏览器能打开的产品页。浏览器显示正常,只能说明你这次请求命中了某个缓存副本,不能说明源站已经恢复。要区分,至少要把证据拆成三层:
三层中任意一层不一致,就不能把“恢复正常”当作已修复。实际动作是:先记录源站响应,再记录缓存响应,最后对比抓取端结果。源站正常而缓存仍异常,下一步应处理缓存刷新;源站本身仍异常,则回到修复流程,不必继续刷新缓存。
缓存是否过期,可以从响应头里的缓存年龄和有效期推断。重点看 Age、Cache-Control、Expires 和 ETag 或 Last-Modified。如果源站已经返回200和新内容,但缓存响应仍带较大的 Age,且未超过 max-age,这更可能是缓存尚未过期,而不是修复失败。
反过来,如果缓存响应里的 Age 已经超过 max-age,却仍返回旧内容,说明缓存没有按预期回源,可能是中间层配置、缓存键或代理规则的问题。此时“清缓存”只是动作之一,还要确认回源请求是否真的到达源站。一个可执行的验证是:在源站访问日志里查找该URL在缓存刷新后的回源记录。若没有回源记录,缓存层可能仍在直接响应,下一步应检查缓存规则而不是继续改页面。
抓取端拿到旧结果,常见解释有三种:缓存副本未过期、抓取排期尚未更新、以及该URL被其他规则限制。不能仅凭抓取端仍显示旧内容就断定修复无效。可区分的证据是:源站返回200且内容正确,缓存响应仍为旧状态,抓取端结果与缓存响应一致。这种组合更支持“缓存未过期”。
若源站返回200,缓存响应也是200且内容正确,抓取端仍是旧结果,则更可能是抓取端自身缓存或排期问题。此时应等待下一次抓取,而不是反复提交同一URL。需要提醒的是,站点地图不保证收录,robots.txt 的抓取限制也不等于可靠的索引移除;这两者都不能用来证明缓存已经刷新或修复已经生效。
以单个此前异常的URL为对象,按下面顺序做,避免把缓存假象当成修复完成:
Age 和内容,与源站对比。这个流程的关键是:每一步都产生可对比的证据,而不是靠感觉判断。若第2步缓存响应与源站不一致,第3步又没有回源记录,那么下一步动作应是检查缓存规则和缓存键,而不是继续修改页面内容。若第2步与源站一致,第4步抓取端仍异常,则下一步动作是等待并观察抓取端,而不是重复清缓存。
页面能打开、状态码变成200、抓取量回升,这些现象都不能单独证明真正修复。页面能打开可能来自浏览器缓存;状态码200可能来自缓存层对旧内容的包装;抓取量变化还可能受排期、站点整体抓取预算或其它页面变动影响。统计上的变化与修复之间是相关关系,不能直接当作因果。
更稳妥的做法是保留一组对照:同一批异常URL中,一部分只做源站修复,一部分同时刷新缓存,分别记录源站、缓存和抓取端结果。若只做源站修复的URL在缓存过期前仍显示旧结果,而刷新缓存的URL较快一致,这能帮助你判断当前瓶颈在源站还是缓存层。这个对照是假设性方法,用来比较不同处理路径,不代表任何固定见效时间。
最终判断标准可以收敛为一句话:源站正确、缓存层与源站一致、抓取端最终也拿到一致结果,三者同时成立,才把该URL标记为真正修复;否则继续按缓存过期或缓存配置问题处理。这个判断会直接决定你下一步是改页面、刷缓存,还是只等待抓取端更新。