canonical 标签常被当成一个「收录开关」来用,以为加上它页面就一定会被收录,或者去掉它页面就会消失。实际上它更接近一个提示:在一组内容相同或高度相似的 URL 里,你希望搜索引擎把哪一个当作首选版本。理解这一点,很多误用就能自己判断出来。
canonical 处理的是「选哪个 URL」,不是「收不收录」
搜索引擎在遇到多个地址指向近似内容时,需要挑一个进入索引,其余的被合并过去。canonical 是你表达偏好的方式之一,但它只是众多信号中的一个,权重不如 301 重定向明确,也不如页面本身的内部链接和外部链接有说服力。如果页面本身质量低、内容薄,或者长期抓取失败,即使 canonical 写得很标准,也不代表它会被收录。
反过来,如果一个页面既没有 canonical,也没有其他重复版本,它并不需要靠 canonical 来「争取」收录。
常见的写法错误
- 指向会跳转的 URL。canonical 指向一个 301 目标地址,等于把首选版本声明成了一条中转路径,爬虫需要多走一步才能确认,容易造成信号混乱。首选版本应当是最终可访问的那个地址。
- 指向被 noindex 的页面。一边告诉搜索引擎「这是首选版本」,一边告诉它「不要索引这个页面」,两个信号直接冲突,结果往往是谁都不进索引。
- 全站统一指向首页。把列表页、详情页、专题页的 canonical 全部写成首页,会让爬虫认为这些页面都是首页的副本,它们的收录价值被主动放弃。
- 分页页面全部指向第一页。如果第 2、3 页有独立价值,全部指回第一页会让后续页码失去进入索引的机会。是否收敛要看这些页码是否真的只是导航。
- 多语言或多地区页面互相 canonical。不同语言、不同地区的页面面向不同用户,应当用 hreflang 建立对应关系,而不是互相声明成重复内容。
- 用相对路径、带追踪参数或 http/https 混写。这些写法不一定出错,但会增加解析成本,也容易在改版后失效。写成完整的绝对地址更稳妥。
它和 301、noindex、sitemap 的关系
如果两个地址是同一个页面,比如 http 与 https,或者带 www 与不带 www,优先用 301 重定向,这比 canonical 明确得多。canonical 更适合「内容相同但无法做重定向」的情况,例如同一个商品被多个分类路径引用。
noindex 是要求页面退出索引,canonical 是声明首选版本,两者不要同时指向同一个页面。sitemap 里如果只提交了首选版本,和 canonical 保持一致即可;如果两个版本都提交,反而会让信号互相抵消。
判断标准很简单:你希望用户最终停在哪个地址上,canonical 就指向那个地址,并保证它自己能正常打开、不被 noindex、不跳转。
排查首选版本冲突的顺序
- 确认页面上是否同时存在多个 canonical 标签,只保留一个。
- 确认 canonical 指向的地址能直接访问,返回 200,且不经过重定向。
- 确认该地址没有被 robots.txt 屏蔽,也没有 noindex。
- 核对 sitemap 与内部链接中使用的地址,是否和 canonical 一致。
- 观察一段时间内抓取日志,看爬虫是否真的在抓取你声明的首选版本。
什么时候可以不写 canonical
如果页面只有唯一地址,没有参数变体、没有多路径引用、没有新旧版本并存,那么不写 canonical 通常没有影响。真正需要处理的是那些确实存在多个地址、又无法靠重定向合并的场景。把这些场景列清楚,比全站机械式地加一段 canonical 更有用。