核心做法是:把“开关状态”当成页面版本的一部分来记录,而不是只记录代码提交。每次开关影响可见内容、链接或状态码时,都要留下开关名、取值、生效时间、受影响URL样本和当时的原始响应,这样百度收录时间的变化才能和具体版本对应起来。只记代码版本、不记开关取值,事后无法判断某次抓取看到的到底是哪个页面。
常见情况是:发版记录显示页面模板几周没改,但百度对这批URL的收录时间开始整体后移,或者部分URL长期停留在旧快照。此时容易得出“搜索引擎出了问题”的结论,但更可能的原因是某个功能开关被单独打开或关闭,页面输出发生了变化。
功能开关的麻烦在于它绕开了常规发布流程。代码版本不变,开关一变,服务端渲染结果、跳转逻辑、canonical、甚至返回状态码都可能不同。对抓取端来说,这就是一个新页面版本。
面对同一批URL收录时间异常,通常有两种成立条件不同的解释:
两种解释对应的处理动作完全不同。前者要评估新内容是否值得被重新抓取,后者要先确认是不是把可抓取URL改成了不可抓取或重复URL。
区分的关键不是后台日志,而是抓取端视角的原始响应。需要固定采集以下证据,并和开关状态绑定:
假设某次开关打开后,正文文本哈希不变,但状态码从200变成302,canonical从自身变成另一个URL。这组证据支持“解释二”,说明问题出在抓取路径,而不是内容质量。反之,如果状态码和canonical都没变,只有正文哈希变了,则支持“解释一”。
这里要说明一个边界:robots.txt的抓取限制不等于可靠的索引移除。即使开关把某些路径写进robots.txt,已经收录的URL也可能继续出现在结果中,不能拿它当版本回退手段。
建议在每次开关变更时,生成一条版本记录,至少包含:
实际动作可以这样落地:开关变更后,立刻对每组模板各取一个代表URL,保存状态码、canonical和正文哈希,并写入版本记录。这个动作的结果会直接决定下一步——如果证据指向抓取路径变化,下一步是核查跳转和canonical;如果指向内容变化,下一步才是评估内容是否需要重新被抓取。
站点地图不保证收录,所以不要把“已提交站点地图”当成版本记录的一部分来证明页面已更新。它只能说明你声明了某个URL,不能说明抓取端看到了哪个版本。
把决策条件写清楚,才能避免每次异常都靠猜:
这套记录方式的价值在于:当百度收录时间出现变化时,你能回答“抓取端当时看到的是哪个版本”,而不是只能回答“代码什么时候发的”。能回答前者,后续的核查和回退才有依据。