网站收录

canonical 标签的自检清单:哪些情况下它其实不生效

canonical 常被当成一键解决重复内容的开关,但它只是提示。目标地址能不能被抓取、两个页面内容差多少、sitemap 与内链是否指向同一个地址,都会影响它是否被采纳。本文拆开讲几种常见失效情况,给出一份可照着做的自检顺序,并说明哪些相似页面其实不该用它。

网站收录

canonical 标签的自检清单:哪些情况下它其实不生效

页面上写了 canonical,并不等于那个地址就会被收录,也不等于当前页一定会从索引里消失。它更像是告诉搜索引擎“这几条地址里,我建议你选这一条作为代表”。最终怎么处理,搜索引擎仍会结合内容相似度、链接关系、抓取情况自己判断。

几个常见的误解

  • 以为加上 canonical 就一定会合并权重。
  • 以为 canonical 可以替代 noindex。
  • 以为 A 指向 B,B 就一定收录,A 就一定掉出索引。
  • 以为在 A 页里写 canonical 指向 B,就能促使 B 被重新抓取。

这些都不是标签能直接决定的事,把它当成一次建议,预期会合理很多。

地址写对了,也可能不生效的几种情况

  • 目标地址本身不可索引:如果 B 页被 robots.txt 屏蔽、带有 noindex、或者返回非 200 状态,A 指向它基本没有意义,搜索引擎不会拿一个不能索引的页面当代表。
  • 两个页面内容差异过大:canonical 更接近“同一份内容的不同地址”这种声明。如果 A 和 B 的标题、正文主体、主要板块差得明显,它可能不被采纳。
  • 信号之间互相矛盾:页面里 canonical 指向 B,但 sitemap 只提交了 A,内链和外部链接也都指向 A,几路信号各说各话,采纳结果往往不如预期。
  • 目标地址本身还在跳转:B 又 301 到 C,链路拉长,处理优先级会下降,最好直接指向最终地址。
  • 标签由脚本后插入:如果靠 JS 在渲染后才写入,而抓取时没有执行到那一步,标签可能根本没被看到。能用服务端输出就尽量用服务端输出。
  • 相对路径写错:相对路径的解析依赖当前 URL,在参数页、深层目录下容易指向意料之外的地方,建议统一写绝对地址。
  • 多语言版本混用:语言版本之间本该用 hreflang 的地方,改成 canonical 互相指向,容易把一个语言版本整片折叠掉。

一份可以照着做的自检顺序

  1. 打开 B 页,确认返回 200、没有 noindex、没有被 robots.txt 挡住,能被正常抓取。
  2. 确认 B 是最终地址,后面不再有跳转。
  3. 确认 A 与 B 的标题、正文主体、主要功能确实一致,差距不要太大。
  4. 确认 canonical 写的是绝对地址,大小写、末尾斜杠、参数与 B 的实际地址完全对得上。
  5. 查看页面源代码(而不是开发者工具渲染后的 DOM),确认标签出现在 HTML 里。
  6. 核对 sitemap、导航和内链中出现的地址,尽量与 B 保持一致。
  7. 改动之后按周观察,而不是按天,给抓取和重新评估留出时间。

不是所有看着像的页面都该用 canonical

有些页面表面上相似,其实是各自独立的内容:不同城市的分站、不同型号的产品、内容有实质差异的列表页。这几类强行 canonical 到同一个地址,用户搜另一个词时反而找不到入口。它们更适合把差异做足,标题、正文、结构化数据各写各的。

真正该收敛的是那些“同一份内容换了个地址”的情况:带追踪参数的链接、排序筛选后等价的页面、http 与 https 并存、大小写或末尾斜杠造成的重复。

它和另外几个指令的分工

canonical 管“选谁当代表”,noindex 管“这个地址别进索引”,robots.txt 管“别来抓”,nofollow 管“别顺着这个链接走”。四个关口各管一段,混着用容易出现指令打架。比如一个页面既写了 noindex,又 canonical 指向另一个正常页面,搜索引擎可能哪边都不采纳。

把 canonical 当成一次建议,而不是一次设置生效。它需要和内容、链接、抓取情况配合,单靠一个标签很难解决收录问题。