canonical 的作用是表达偏好,不是下达命令。搜索引擎会参考它,但最终把哪个 URL 当作规范版本,还要综合站内链接、站点地图、外链、重定向等一整套信号。所以常见的情况是:标签写得很认真,索引里留下的却是另一个版本。
先分清重复的是哪一类
不同的重复形态,处理方式差别很大,动手前先归类:
- 同一内容多个 URL:参数排序、大小写、末尾斜杠、打印版、跟踪参数。
- 内容相近但并非完全相同:列表翻页、筛选结果、同款不同规格。
- 跨域或跨子域:www 与非 www、移动站与主站、测试域名上线后残留。
canonical 没被采纳的常见原因
- 目标 URL 本身不可索引:canonical 指向的页面是 404、301、带 noindex 或被 robots.txt 屏蔽,等于把票投给一个进不来的页面。
- 抓取阶段看不到:canonical 由 JavaScript 注入,渲染队列还没轮到,抓取时拿到的初始 HTML 里什么都没有。
- 信号互相打架:canonical 指向 A,内链、站点地图、面包屑却都指向 B。
- 各版本各自为政:每个参数页都 canonical 到自己,表面上写了标签,实际上没有收口。
- 写法不规范:用了相对路径,或把带参数的地址写进标签,解析结果和预期对不上。
建议的自查顺序
- 先拉出重复 URL 清单:索引状态报告、服务器日志、站点地图三处取交集,比单看一处靠谱。
- 检查目标 URL 的可索引状态:返回码、meta robots、HTTP 头里的 X-Robots-Tag、robots.txt 逐项过一遍。
- 确认 canonical 出现在初始 HTML 中,别只在浏览器渲染后的源码里查看。
- 对齐站内信号:内链、站点地图、分页链接、hreflang 都指向同一个版本。
- 确认标签使用绝对地址,协议、主机名、路径与实际访问完全一致。
- 改完观察一个完整抓取周期,看索引中的规范版本是否逐步收敛,不要当天就下结论。
什么时候该用 301 而不是 canonical
如果旧 URL 已经确定不再使用,两个版本之间是永久替代关系,301 更直接,也更省事。canonical 更适合两个版本都需要保留、用户都可能访问的场景,比如排序参数、打印版、渠道跟踪参数。
两者也可以配合,但方向必须一致:不要一边 canonical 到 A,一边又 301 到 B,那样等于自己给自己制造矛盾。
写法上的几个细节
- 用绝对地址,包含协议和主机名。
- 一个页面只写一个 canonical,重复出现容易造成解析歧义。
- 不要 canonical 到会跳转的地址,直接写最终地址。
- 分页页面统一 canonical 到第一页,会让后续页面的内容失去被单独选中的机会,通常不建议。
- hreflang 与 canonical 要配套,不要 hreflang 指向 A 而 canonical 指向 B。
别忽略页面本身的差异
如果两个 URL 的内容相似度只有七八成,搜索引擎完全可能把它们当成不同页面。这时与其反复调标签,不如先回答一个问题:这两个页面到底该不该同时存在。合并内容、补足差异,或者干脆下线一个,往往比改标签更有效,也更省后续维护成本。
canonical 是在表达偏好,不是在做决定;它能否生效,取决于整站信号是否指向同一个方向。