canonical 是建议,不是命令
canonical 标签的作用,是告诉搜索引擎:在这一组相似页面里,哪一个才是我希望它代表主版本。它是一种提示信号,搜索引擎会参考,但不会无条件照做。很多站点的问题不在于没写,而在于写错,或者写得自相矛盾,最后让本来清晰的页面关系变得模糊。
可以用一个简单标准判断:如果把这个 canonical 去掉,页面的规范地址是否依然能被正确识别?如果不能,说明你依赖它太多;如果能,它只是锦上添花。
几种常见的误用
- 全站指向同一个地址。模板里写死一条 canonical,导致所有栏目页、详情页都指向首页或某个列表页。这等于主动声明这些页面都是重复内容,是影响最大的一种写法。
- 指向不可访问的地址。canonical 指向的页面返回 404、被 robots.txt 屏蔽,或者又通过 301 跳到别处。信号链断掉之后,搜索引擎只能自己猜。
- 同一页面出现多条 canonical。一条在 head 里,另一条由组件或脚本注入,两者地址还不一样。这种情况通常会被整体忽略。
- 写在 body 里,或只在渲染后出现。canonical 应放在 head 区域,并且能在初始 HTML 中直接读到。如果只有浏览器执行脚本后才出现,部分抓取场景下可能读不到。
- 分页全部指向第一页。列表分页的每一页都是独立可访问的地址,一般各自自指向即可。全部压到第一页,会让后续页面的内容很难被单独看待。
一份可以照着做的自查清单
- 关闭浏览器 JS,右键查看网页源代码,确认 canonical 出现在 head 中,且使用完整地址而非相对路径。
- 统计全站 canonical 的取值分布,看是否存在大量页面指向同一个 URL 的情况。
- 抽取部分 canonical 指向的地址逐个访问,确认返回 200,没有被 robots.txt 屏蔽,也没有多余跳转。
- 确认同一页面只有一条 canonical,排除模板与组件重复注入。
- 比对 canonical 与实际地址的大小写、尾部斜杠、http 与 https、是否带 www,这些应与页面真实地址完全一致。
- 带参数的页面(排序、筛选、追踪参数)统一指向不带参数的主版本,并确认这个主版本本身可以正常访问。
- 多语言站点检查 hreflang 与 canonical 是否冲突:通常各语言版本自指向,再由 hreflang 建立彼此关系。
和其他信号保持一致
canonical 不是孤立的。内链指向哪个地址、站点地图里提交的是哪个地址、301 重定向最终落到哪个地址,这些最好都指向同一个版本。几个信号各说各话时,搜索引擎会自己挑一个它更信任的,结果往往不是你想要的那个。改版迁移期间尤其要注意:老地址如果还活着,用 301 转过去即可,不必再额外加一条指向新地址的 canonical 来加强语气。
观察效果的方式
写完之后不用天天盯着看。可以在服务器日志里留意搜索蜘蛛对同一组页面的抓取偏好,看它更多抓取的是你指定的规范版本,还是那些重复版本。如果过了一段时间,重复版本仍被频繁抓取,再回头检查上面的清单,问题通常出在某个环节没有对齐,而不是这一条标签本身没生效。