当 canonical 标签由功能开关控制时,页面输出会随开关状态在“自指”和“指向聚合页”之间切换。此时真正需要记录的不是开关本身,而是每个版本下 canonical 的取值、生效范围和切换时间点。做法是:为每个开关状态建立一份可回退的版本快照,并在快照中明确 canonical 的来源、目标 URL 和抓取可见性,而不是只依赖一次抓取结果。
功能开关让同一 URL 可能输出不同 canonical,三种处理各有前提。
判断依据不是开关是否“开”,而是同一 URL 在不同状态下 canonical 是否指向不同目标。如果指向相同,保留记录;如果指向不同,改写记录;如果旧目标已不可访问,退出旧记录。
只记录“canonical 已改”没有可操作性。一个可用的版本状态至少包含以下字段,并注明假设的抓取环境。
feature_switch=A 或 feature_switch=B。假设一个页面在开关 A 下输出自指 canonical,在开关 B 下指向分类页。若只记录“开关 B 已开启”,当分类页被合并或删除时,就无法判断该回退到哪个状态。补齐目标 URL 和回退动作后,下一步才能直接验证回退结果,而不是重新猜测。
版本状态对不上,常见原因有两类,处理方式不同。
原因一:开关切换后缓存未更新。 证据是同一开关状态下,不同时间抓取到的 canonical 不一致,且服务端返回与渲染后结果不同。此时先清缓存再记录,不要把缓存差异写进版本状态。
原因二:开关本身按用户分组生效。 证据是同一时间、同一开关配置下,不同请求返回不同 canonical,且差异与用户标识或地域相关。此时版本状态必须增加分组维度,否则记录永远无法对齐。
两种原因的区分动作是:固定开关状态,连续抓取两次并对比 canonical 目标。若两次不同,先查缓存;若两次相同但换一个请求环境就不同,则查分组条件。这个动作的结果直接决定下一步是清缓存,还是扩展版本记录的分组字段。
回退不是把开关拨回去就结束。应先取当前版本状态,确认目标 canonical 是否仍可访问;若目标已不可用,回退到自指版本反而更安全。验证动作包括:检查目标 URL 是否返回正常内容、是否被 robots.txt 限制抓取、以及站点地图是否仍包含它。
需要说明的是,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。因此回退后不能仅凭抓取量或请求量变化判断处理正确,这些现象还可能来自缓存、抓取调度或分组差异。只有在固定开关状态、固定抓取方式并记录版本快照后,变化才具备可比性。
若回退后 canonical 恢复为自指,下一步应更新版本状态中的回退动作,标注本次验证时间和目标可用性,而不是删除旧记录。这样下一次开关切换时,才有可对照的基线。