canonical 是一个很小的标签,写在 head 里,平时几乎没人注意。可它一旦写错,影响是全站性的:搜索引擎会按你标注的地址去归并信号,如果标错了,真实内容可能被当成副本,错的地址反而被当成正主。更麻烦的是,这类问题不会报错,页面照常打开,只有主动比对才会发现。
先弄清楚 canonical 想解决什么
同一个内容常常有多个可访问地址:带筛选参数、带大小写差异、带尾斜杠、分页、打印版、移动版。canonical 的作用是告诉抓取方:这几条地址里,哪一条是我认可的正式版本。它不是重定向,不会让用户跳转,也不保证一定被采纳,只是一条建议性的信号。
理解这一点很重要。很多人把 canonical 当成万能胶,哪里觉得重复就贴哪里,结果反而制造出新的矛盾。
常见的几种写歪方式
- 全站统一指向首页:模板里写死一个固定地址,导致所有文章页都声明首页是正主。这等于主动放弃自己的页面,是最严重的一类。
- 分页页全部指向第一页:列表第 2、3 页与第一页内容并不相同,却声明第一页为正式版本,后续页面容易失去被发现的机会。
- 目标地址本身不可用:canonical 指向的地址返回 404、5xx,或者落在一条很长的跳转链上,信号无处落地。
- 多语言版本混指:不同语言页面互相 canonical 到同一个地址,和 hreflang 的表述互相打架。
- 参数页缺少自指:筛选、排序、会话参数生成的地址既没有自指,也没有指向干净版本,重复内容就这么堆积起来。
- 一个页面出现多条 canonical:模板拼接或组件重复输出,head 里出现两条以上,抓取方只能自己挑一条,结果不可控。
自查可以按这个顺序做
- 取一批代表性地址:首页、栏目页、文章页、分页页、参数页、多语言页,每类挑几条,不要只看首页。
- 把这些页面的 canonical 值导出成一张表,和页面自身的 URL 放在同一行对比,视觉上一眼能看出是否自指。
- 逐条判断是否同时满足三点:自指、指向同类内容、指向一个可正常访问的地址。
- 沿着 canonical 目标再访问一次,确认它不跳转、不 404、不返回 5xx,也不是另一个 canonical 的中间站。
- 单独检查分页与多语言:分页按既定策略自指或指向干净列表,多语言自指,跨语言关系交给 hreflang 表达。
- 把结果记录进表格并标明日期,模板改动后重新跑一遍,避免旧结论一直沿用。
和别的信号保持一致
canonical 不是孤立存在的。它要和你提交的 Sitemap、站内链接、跳转规则说同一件事。如果 Sitemap 里写的是 A 地址,页面 canonical 指向 B,内链又大量指向 C,三种信号互相拆台,抓取方只能自己猜。更省事的做法是:先把哪个地址是正式版本定下来,再让这几处全部对齐,改一处就顺带检查其余几处。
发现异常时的排查次序
先看模板输出是否被错误复用,再看 head 里是否出现重复标签,然后确认目标地址的状态码和跳转层数,最后才去怀疑抓取方的判断。多数问题出在模板,而不是抓取策略。
别把它当成一次性工作
模板一改、频道一加、参数规则一调,canonical 的输出就可能跟着变。建议把它放进发布检查清单里,尤其是涉及列表页和详情页模板的改动。平时也可以定期抽样,看新发布的页面是否还带着正确的自指。
提示:canonical 是建议而不是命令。与其指望它兜底,不如从源头减少同一内容的可访问地址数量,把重复地址控制在少量范围内,剩下的再交给它收口。