很多站点在页面上写了 rel="canonical",就觉得规范化这件事已经交代过了。但搜索引擎最终把哪个 URL 当作正式版本,并不只看这一处声明。canonical 只是一个建议信号,它还要和站内链接、站点地图、重定向、hreflang 等一堆表态放在一起看。当这些信号互相矛盾时,结果往往不是简单听 canonical 的,而是变得难以预测:有时收录的是你以为的副本页,有时两个 URL 都没进索引。
站内到底有哪些地方在表态
在判断冲突之前,先要清楚同一个页面可能被好几处指认:
- canonical 标签:页面自己声明的正式版本 URL。
- 站内链接:导航、面包屑、正文链接实际指向哪个 URL。
- 站点地图:sitemap 里提交的是哪个 URL。
- 重定向:301 或 302 把请求送到哪个 URL。
- hreflang:多语言版本之间的互相指向。
- 外链:别人链接到你的哪个形态。
这些信号方向一致时,问题很少;一旦分叉,就要逐个排查。
几类常见冲突
- canonical 指 A,内链全指 B。 页面自己说自己应该是 A,但站内所有入口都通向 B。这种情况下 B 反而更容易被抓取、被当成主版本。要么统一成 A,要么把 canonical 改成 B,不要两套并行。
- canonical 链式跳转。 A 的 canonical 指向 B,B 又指向 C。链式声明会把判断拉长,最好直接指向最终那个 URL,一步到位。
- canonical 指向不存在的地址。 目标 URL 返回 404 或 5xx,等于把信号指向空气,和没写差不多。
- canonical 与 noindex 同时出现。 一个说以别的页面为准,一个说别收我,两者叠在一起容易让状态变得模糊。想合并就只用 canonical,想彻底不要就只用 noindex。
- 带参数的页面全部 canonical 到第一页。 筛选页、排序页内容确实高度相似时这样做可以理解,但如果第一页和参数页内容差别很大,一律指回去会损失本来有价值的页面。
- hreflang 和 canonical 互相矛盾。 hreflang 说各语言版本各自独立,canonical 却把它们都指向同一个 URL,等于自己否认了多语言结构。
- 大小写、结尾斜杠、协议版本混用。 同一内容同时存在 /Page、/page、/page/ 等多个形态,而 canonical 只写了其中一个,剩下的要靠重定向收口,否则容易各自被抓。
排查顺序
- 先抽一批 URL,覆盖首页、栏目页、详情页、参数页、多语言页,数量不必多,但要分层。
- 记录每个 URL 的 canonical 值,同时记录它的实际返回状态码和最终跳转地址。
- 横向对比:这个 URL 在 sitemap 里是什么形态?站内链接指向它还是它的兄弟页?外链指向哪个?
- 找出指向关系里的矛盾点,按改动成本低、影响面大的顺序处理,通常是先统一站内链接和 sitemap,再动 canonical。
- 处理完用同一批 URL 复查,隔一段时间再看索引状态有没有跟着变,不要只看自己改了没有。
处理时的几条原则
- 能用一个 URL 表达的内容,就不要留两个形态给搜索引擎去猜。
- canonical 要和站内实际链接方向一致,否则它很难被当真。
- 不要为了让某个页面更容易被收而临时改 canonical,改动要能长期站得住。
- 规范化解决的是哪一个是正式版本,不是能不能被收录,这两件事别混在一起期待。
canonical 是一句话,站内链接和 sitemap 是另外很多句话。当它们说的不是同一件事时,先别急着改 canonical,先看看全站到底在往哪个方向指。