很多站点把 rel=canonical 当成一块指路牌,以为在页面里写上目标地址,蜘蛛就会只抓那一个 URL。实际对照日志时经常是反过来的:canonical 写明了 A,蜘蛛却仍在 B 上频繁出现。
原因不复杂。canonical 是一个合并信号,用来告诉搜索引擎多个地址中哪个代表正文,它并不改变蜘蛛怎么走。蜘蛛走的是链接,你内链指到哪、Sitemap 列了哪、外链落在哪,它就往哪走。
canonical 是提示,不是转向指令
和 301 不同,canonical 不会让蜘蛛停止抓取当前 URL,也不会把抓取请求强制转到目标地址。蜘蛛仍然会抓当前的 B 页,读出 canonical 里的 A,再把 A 当作正文归属。也就是说:抓取路径由链接决定,收录归属才受 canonical 影响。
如果 B 是被大量内链指向的那个地址,抓取预算就会持续消耗在 B 上;A 反而可能因为缺少入口而长期不更新。
几种常见的指向不生效
内链指向的不是 canonical 地址
导航、列表、面包屑、相关推荐如果都写着带参数的版本,例如带 from=list 这类标记的地址,蜘蛛自然会把参数版当成主入口,canonical 里的干净地址反而成了缺乏链接的页面。合理的处理顺序是:先把内链统一到目标地址,再谈 canonical。
Sitemap 与 canonical 不一致
Sitemap 是蜘蛛发现 URL 的重要入口。如果 Sitemap 里躺着参数版、旧版、大小写不一致的地址,就等于在和 canonical 唱反调。较稳妥的做法是:Sitemap 只列 canonical 地址,并保证这些地址返回 200、能正常渲染。
canonical 指向了会跳转或报错的地址
canonical 的目标如果本身就是 301、302,或者返回 404、5xx,蜘蛛需要多走几步才能确认归属,有时干脆无法确认。服务器不稳定时,目标地址间歇性超时,合并信号会变得很模糊。canonical 指向的地址,最好是一个稳定、可直接访问、返回 200 的 URL。
分页页面的 canonical 全部指向第一页
把第 2、3 页的 canonical 统一指向列表第一页,是一种常见写法。它的后果是:蜘蛛从第 1 页沿分页链接走到第 5 页,每页却都告诉它正文在第一页。时间一长,深处详情页的发现路径会变窄。分页更适合自引用 canonical,让每页代表自己。
与 noindex、hreflang 互相打架
canonical 指向 A,同时页面又写 noindex,或者 hreflang 把 A 指回 B,几种信号会互相抵消。遇到冲突时,蜘蛛通常选择更保守的处理方式,结果是该抓稳的没抓稳,该合并的没合并。多语言站点尤其要注意:hreflang 指向的地址应当与 canonical 保持一致。
自查时可以先看这几项
- 站内链接是否都指向 canonical 地址,有没有残留的参数版入口。
- Sitemap 里的 URL 与 canonical 是否一一对应。
- canonical 目标是否返回 200,而不是靠重定向才能到达。
- 是否存在 canonical 链,A 指 B、B 又指 C,尽量一步到位。
- 页面里是否只出现一个 canonical 标签,脚本注入的版本是否与 HTML 中的冲突。
- 用服务器日志核对:蜘蛛实际高频抓取的地址,是不是你以为的那一个。
判断 canonical 有没有起作用,不要只看页面标签,要看日志里蜘蛛走的那条路。路没变,标签写得再对,效果也有限。
最后提醒一句:canonical 解决的是哪个地址代表内容,不是蜘蛛该走哪条路。想让蜘蛛沿你设计的方向走,靠的是内链、Sitemap 和稳定的服务器响应;这三者对齐之后,canonical 才更容易被采纳。