canonical(规范链接)本质上是页面里一个普通的 link 标签,作用是告诉搜索引擎:这一组相似地址里,我建议你把哪一个当成主版本。它是提示信号,不是重定向,也不是指令。写对了可以减少重复,写错了却可能让本来能被索引的 URL 退出索引,或者让主版本迟迟不被替换。
一、canonical 指向的几种典型错误
1. 指向会跳转的 URL
常见场景是:A 地址已经 301 到 B,但 B 页面的 canonical 仍然写着 A。爬虫顺着这条线走过去,先遇到一次跳转,又回到当前页面,规范信号被绕了一圈,等于没有表态。写法上应当直接指向最终可达、返回 200 的那个地址。
2. 指向被屏蔽或 noindex 的 URL
canonical 指向的页面被 robots.txt 拦掉、带 noindex,或者需要登录才能打开。这类目标对搜索引擎不可见,主版本就无法被确认。结果可能是 canonical 被忽略,也可能是两个地址都停留在不确定状态。规范目标本身应该是可被抓取、可被索引的。
3. 链式与互指
A 指 B、B 指 C、C 又指回 A,是模板拼接或改版遗留造成的。每多一跳,信号就多一次稀释。互指更隐蔽:A 指 B、B 指 A,两边看着都像主版本,实际谁也不算。一组相似页面里,最好只有一个地址承担主版本角色。
4. 指向 404、410 或不存在的地址
多出现在域名迁移、目录调整之后:只改了页面模板,没同步改 canonical,于是整站页面都在向一个死链表达规范关系。这种写法不但不起作用,还会让后续排查绕远路。
5. 分页与筛选页统一指向第一页
把第 2 到第 N 页的 canonical 全部指回第 1 页,会让后续分页上的条目失去独立入口。如果这些条目本身有各自的 URL,优先保证条目地址能被发现和抓取,而不是把整组分页压成一个地址。取舍要看这些分页是否承载了独立内容。
6. 跨域指向内容并不相同的页面
跨域 canonical 成立的前提是两边内容高度一致。若只是主题相近、正文不同,硬指过去并不能解决重复问题,反而可能让两边的收录判断都变模糊。
二、自查方法
- 抽样抓取:随机取几十个不同模板的页面,看 HTML 里的 canonical 是否与浏览器最终地址一致,重点核对协议、www、目录和尾斜杠。
- 单独访问一次:把 canonical 里的目标地址复制出来单独打开,确认返回 200 且没有被 robots 规则挡住。
- 对照站点地图:sitemap 里提交的 URL,应与页面 canonical 指向的 URL 保持一致,两套口径不一致时先统一。
- 看索引状态变化:被 canonical 排除的 URL 数量是收敛还是异常增长,判断属于预期收口还是配置写错。
三、修复顺序
- 先修指向死链、重定向和被屏蔽地址的 canonical,这类写法完全没有正向作用。
- 再解开链式与互指,让一组页面只保留一个主版本。
- 然后统一写法,并让内链、站点地图、canonical 三者指向同一个地址。
- 最后观察索引状态,改动需要等页面被重新抓取后才可能体现,不会即时生效。
canonical 是建议,不是命令。它的作用建立在一个前提上:这些页面的内容确实高度相似。
如果两个页面的正文差别明显,与其硬指 canonical,不如考虑合并内容、做重定向,或者干脆保留为两个独立页面。canonical 能处理的是同一份内容出现在多个地址,处理不了两份不同的内容。改动之后,先看抓取日志里这些 URL 的访问频率有没有变化,再判断后续的索引状态,比盯着某一天的收录数字更可靠。