站内出现两个内容几乎一样的 URL 时,很多人的第一反应是加一条 canonical。但 canonical 具体该指向哪里,往往没想清楚就抄了模板,结果把本来有机会被收录的页面也一起交了出去。
canonical 是提示,不是命令
rel="canonical" 的作用是告诉搜索引擎:这一组 URL 里,我认为哪个是主要版本。它是信号,不是重定向,也不阻止抓取。搜索引擎会结合内链、sitemap、页面内容、外链等因素综合判断,可能采纳,也可能不采纳。
所以写 canonical 要有个前提:页面之间确实高度重复,或互为变体,才需要收敛。内容本来就不同的两个页面硬加 canonical,只会让其中一个白白失去被收录的机会。
大多数页面应该指向自己
每个正常页面最好都有一条指向自身的 canonical。看起来多余,但确实有用:
- 模板自动生成的 canonical 一旦出错,比如域名或语言写错,自指能避免它被错误继承;
- 减少参数、大小写、协议等变体带来的歧义;
- 内容被其他工具采集、拼接后,原始版本是哪一条仍然说得清。
什么时候该指向别的 URL
比较典型的有几类:
- 参数变体:同一篇内容因为跟踪参数、排序参数产生了多个 URL,把带参数的版本指向不带参数的版本;
- 打印页、纯文本页:一般指向正常浏览版本;
- 多域名或 www 与非 www 同时可访问:可以指向主域名版本,但更稳妥的做法仍是 301;
- 同一内容被放在多条路径下:比如同时出现在两个栏目里,需要选出主路径。
分页不要简单地全部指向第一页
把 page/2、page/3 全部 canonical 到第 1 页,是常见操作错误。这些页面各自有不同内容,通常应自指,再依靠内链让抓取路径保持通畅。
几种常见的误用
- canonical 指向一个会 301 的 URL。链条一长,信号容易被忽略,应直接写成最终地址。
- canonical 指向被 noindex 的页面。两个信号互相矛盾,结果可能是两边都进不了索引。
- 全站共用一个 canonical。多半是模板变量没渲染出来,等于把整站内容都指向同一页。
- canonical 指向不存在的 URL,或相对路径写错。检查时以浏览器「查看网页源代码」里的实际输出为准,而不是模板文件。
- 跨域 canonical 用得太随意。它可以是内容被转载后的补救手段,但如果目标站点不由自己控制,效果并不稳定。
和 sitemap、内链、重定向怎么配合
canonical 单独用效果有限,需要和其他环节说同一件事:
- 内链尽量指向规范版本,别让用户和蜘蛛都涌向变体 URL;
- sitemap 里只放规范版本,把变体排除在外;
- 如果是永久迁移,比如换域名、改目录结构,用 301 而不是 canonical;
- 规范版本的页面本身要可抓取、可索引、返回 200。
如果规范版本自己都没有入口链接,或者被 robots、noindex 挡住,canonical 写得再规范也没有意义。
怎么确认有没有生效
几个可操作的检查点:
- 用站内工具或抓取脚本抽查页面的 canonical 实际输出,确认没有空值、没有拼接错误;
- 在搜索平台的 URL 检查工具里,看「用户声明的规范网址」和「系统选择的规范网址」是否一致;
- 隔一段时间再看,用索引状态查询确认变体页面是否在收敛;
- 对照抓取日志,看看变体 URL 的抓取频次有没有下降。
canonical 解决的是「选哪个版本」的问题,解决不了内容本身质量低的问题。如果两个页面都只是薄内容的模板页,收敛之后剩下的那一个,也不一定就会被收录。