核心做法是把“开关状态”当作 canonical 版本的一部分来记录,而不是只记录页面模板。开关打开和关闭时,页面输出的 canonical 可能指向不同地址,因此每次变更都要留下开关值、生效范围、页面样本和验证结果;否则回滚时无法判断旧状态是否真的恢复。
全量切换指开关一次性改变所有页面的 canonical 输出,例如从自引用改成指向聚合页。按条件命中指开关只对部分页面生效,例如仅对带某个参数的请求改写 canonical。两者的记录方式不同,判断依据也不同。
选择依据是:如果开关会影响未预期的页面,说明条件写得过宽,此时不能只靠样本通过就上线。实际动作是先跑一次全量 canonical 输出对比,把命中集合和未命中集合分开,再决定是否需要收窄条件。
只记录“某天改过 canonical”没有用。需要能回答:当时开关是什么值,哪些页面因此变化,变化后的 canonical 指向哪里。建议每次变更保存一份结构化记录,字段至少包括:
canonical_mode=aggregate。<link rel="canonical">。动作上,每次开关变更后重新抓取样本页面的 canonical 字段,把结果写入同一份记录。如果发现命中集合里混入了不该改的页面,下一步不是继续扩大样本,而是先修正条件,再重新记录,否则版本状态会越记越乱。
个别样本成立、规模化后出现例外,常见原因有三类,证据不同,处理也不同。
这里有一个假设例子:某站点把开关从自引用切到聚合页,抽样十个页面全部正确,但上线后带分页参数的页面仍输出自引用。检查发现开关条件没有覆盖分页路径。这个例子的意义在于说明:抽样通过不等于范围完整,记录版本状态时必须把未覆盖的路径也列出来,作为下一轮验证对象。
回滚不是把开关改回去就结束。需要按变更前保存的样本清单重新请求,逐项比对 canonical 是否回到旧值。如果旧值本身依赖另一个开关或配置,要一并恢复,否则会出现“开关回滚了,canonical 没变”的情况。
另外,抓取限制、站点地图或 HTTPS 状态都不能替代 canonical 版本记录。robots.txt 的抓取限制不等于可靠的索引移除,站点地图不保证收录,HTTPS 也不保证安全无漏洞或排名。这些信号与 canonical 开关状态是不同层面的事实,不能互相证明。
最后,记录版本状态的目的不是追求一份完美文档,而是让下一次变更或回滚有可核对的依据。只要开关值、生效范围、样本输出和验证结果能对应上,例外就能被定位,而不是靠猜测。