直接回答:把“收录查询结果不一致”当成一个可复现的版本问题,而不是收录问题。先固定查询条件(URL、UA、地区、是否登录、是否带参数),再逐层比对CDN、反向代理、应用层、对象缓存和数据库返回的内容指纹;哪一层开始出现差异,问题就锁定在那一层及其上游。下面从一种常见矛盾现象切入,给出两种解释和能区分它们的证据。
场景:站点做过一次内容下线或迁移,旧内容只保留了一部分。你用同一个URL做收录查询,第一次返回旧标题和旧描述,第二次返回新标题,第三次又变回旧版本。刷新、换浏览器、换网络,结果仍然飘忽。
这时不要急着判断“搜索引擎收录错了”。收录查询看到的是某一层缓存吐给你的副本,它未必等于搜索引擎索引里的版本,也未必等于源站当前版本。真正要回答的是:这些不同版本分别来自哪一层,以及哪一层没有按预期失效。
不同层用了不同的键。例如CDN按“URL+地区”缓存,反向代理按“URL+UA”缓存,应用层按“URL+登录态”缓存。当请求落进不同键空间,就会拿到不同版本。这种情况下,差异是稳定的、可预测的:同一组条件重复请求,结果一致。
内容更新时只清了一层缓存,或者清除请求失败、超时、被上游忽略。旧版本残留在某一层,直到TTL自然到期。这种情况下,差异是随时间衰减的:越接近更新时刻越容易看到旧版本,过了某个时间点后逐步收敛。
两种解释都会表现为“返回不同版本”,但处理动作完全不同。前者要统一缓存键,后者要修失效通知。
按下面顺序取证据,每取到一条就能排除一部分可能:
Age、X-Cache、Via、Cache-Control 等字段。若 Age 很大且内容仍是旧版,说明该层命中了未失效的旧副本;若 Age 很小但内容仍是旧版,说明上游本身就返回旧版。假设某站点有三层:CDN、Nginx反向代理、应用内对象缓存。某次下线旧页面后,收录查询持续返回旧标题。按上面步骤操作:
Age: 86400,指向CDN层命中旧副本。结论:CDN清除请求发出但未即时生效,问题在CDN失效链路,而不是源站或索引。下一步动作是核查清除请求是否被CDN接受、键是否与缓存键一致,而不是去改robots.txt或重提站点地图。
定位到具体层之后,动作才有意义:
需要提醒的是:robots.txt的抓取限制不等于可靠的索引移除,站点地图也不保证收录;这些手段解决的是“让搜索引擎看到什么”,而当前问题是“你查询时拿到的是哪一层副本”。两者不要混在一起处理。另外,请求量或抓取量归零不能单独证明缓存处理正确,它也可能来自抓取预算变化、屏蔽规则或统计口径调整,需要结合响应头和逐层比对一起判断。
最后,把每次验证的URL、条件、响应头关键字段和内容指纹记下来,形成可复核记录。这样无论问题出在哪一层,你都能用同一组证据向开发或运维说明现象,而不是反复描述“一会儿新一会儿旧”。