核心做法是:把每次功能开关的变更当作一次“页面版本发布”来记录,而不是只记录代码提交。具体要同时留存开关名称、生效范围、开关前后的可见内容快照、URL与状态码、robots与canonical状态,以及记录时间。这样当百度收录出现波动时,才能判断是开关本身、开关影响的内容,还是抓取与索引环节的延迟,而不是把时间上的重合直接当成因果。
功能开关的特点是同一份代码在不同环境下可以输出不同页面。代码提交记录只能说明“什么时候改了程序”,不能说明“某个URL当时实际输出了什么”。如果开关按用户分组、按地域、按登录状态或按灰度比例生效,同一时刻不同访客看到的页面可能完全不同,而百度抓取到的只是其中一个版本。
因此版本状态记录至少要能回答三个问题:这个URL在某个时间点对匿名访客输出了什么;当时返回的状态码和规范化标签是什么;这个状态是由哪个开关的哪个取值造成的。缺少任何一项,后续排查都只能靠猜。
发现开关导致页面变化、且收录表现异常时,通常有三种处理方向。它们适用的前提不同,不能混用。
如果开关本就应该改变页面内容,且新内容对用户是有意义的,那么该保留。适用前提是:变化后的页面仍是完整的、可独立访问的、对匿名访客稳定的HTML内容。此时要做的不是回退,而是补上版本快照,让后续对比有基准。
当开关让页面主体内容被替换、被折叠,或者让canonical指向了另一个版本时,需要考虑改写。适用前提是你能明确说出“哪个版本才是希望被收录的”。如果说不清,说明问题不在开关,而在内容规划,此时改写只会制造新的不一致。
如果开关对匿名抓取者随机输出不同内容,或者让同一URL在不同抓取中返回不同状态码,那么退出该开关在抓取路径上的生效是更稳妥的选择。适用前提是该开关对匿名访客并非必需。注意,用robots.txt限制抓取不等于可靠的索引移除,被限制抓取的URL仍可能因外部链接而出现在结果中,所以退出开关与写robots规则是两件事。
不必追求复杂的版本系统,但下面这些字段应成组记录,缺一项就会在排查时失去判断依据。
一个假设的例子:某列表页的开关控制“是否展示摘要”。若记录显示开关关闭后,页面正文只剩标题且canonical未变,那么可以判断这是内容层面的变化,而不是抓取问题。下一步应先确认该状态是否为目标状态,再决定是否恢复摘要,而不是直接去改站点地图。站点地图本身不保证收录,它只能帮助发现URL,不能替代对页面状态的判断。
在小范围测试时,开关的影响往往看起来可控:几个URL、一种生效条件、一次抓取。规模扩大后出现例外,通常来自三类边界。
因此,小样本结论不能直接照搬到全量。可执行的动作是:在扩大生效范围前,先对同一URL在开关两种取值下各取一次匿名快照并对比,确认差异只出现在预期区块;若差异超出预期,先缩小生效范围,再补齐记录字段。这个动作的结果会直接决定下一步是继续放量,还是先修正开关的生效条件。
记录的价值在于缩短判断路径。当收录表现出现波动时,先用时间线比对:波动时间点附近有哪些开关发生了取值变化,这些开关是否作用在出现问题的URL上。若没有重合,就不要把开关当作原因;若有重合,再用快照确认变化后的页面是否仍满足可抓取、可独立访问、内容完整这三个条件。满足则继续观察,不满足则按前面的取舍决定保留、改写还是退出。整个过程以记录为依据,而不是以时间上的巧合为依据。