canonical 是一个不影响用户、也不影响页面正常打开的标签,所以它常被忽略。但它决定了搜索引擎在这个页面存在多个访问地址时,把哪一个当作主版本。写对的时候没人注意,写错的时候通常也不报错,只会慢慢表现为抓取分散、同一份内容被多个地址各分走一部分信号、改版之后旧地址迟迟不退场。
先确认页面是不是真的需要它
不是每个页面都必须写 canonical,但绝大多数正常页面应该写自引用,也就是指向当前页面的完整地址。最常见的错误来自模板复制:详情页模板忘了改,结果全站详情页的 canonical 都指向栏目页,或者栏目页统一指向首页。这类错误一旦成批出现,等于主动告诉搜索引擎“这些页面不用单独看”。
- 协议和域名要和实际访问一致:https 页面写了 http 地址,或者 www 写成了不带 www,等于把主版本让给了另一个地址。
- 末尾斜杠、大小写、参数顺序保持统一,别让同一个栏目出现两套写法。
- 列表页、详情页、专题页一般建议自引用,除非你确实打算把它们合并成一个地址。
参数页与筛选页怎么处理
排序、筛选、跟踪参数会生成大量高度相似的地址。处理时需要成体系,而不是逐页凭感觉写。
- 参数不改变内容主体,比如排序方式和分页之外的纯展示参数:canonical 指回不带参数的干净地址。
- 参数带来的是不同内容集合,比如筛选后的独立列表:可以考虑自引用,同时评估这个集合是否值得被单独抓取。
- 跟踪参数:canonical 指回干净地址,别把带跟踪参数的地址当成主版本。
关键是一致性。同一个栏目里,一部分筛选页自引用、另一部分指回列表页,搜索引擎很难判断规律,判断成本最后会转嫁到抓取效率上。
分页的 canonical 别写反
分页是容易出错的地方。常见做法是第 2 页及之后自引用,而不是所有分页都指回第 1 页。全部指回第一页,会让深层内容失去被单独看待的机会。具体策略要结合站内实际情况决定,但至少不要在分页之间形成互相指向的环,也不要让分页的 canonical 指到一个被屏蔽或带 noindex 的地址上。
和 sitemap、robots、hreflang 对齐
- sitemap 里提交的地址,尽量和 canonical 声明的地址一致,避免提交清单和页面声明互相矛盾。
- canonical 指向的地址不应被 robots.txt 屏蔽,也不应带 noindex,否则信号之间会打架。
- 多语言站点中,hreflang 使用的地址和 canonical 要能对得上,别一套指向 A、一套指向 B。
- 镜像站或备用域名做跳转时,canonical 与跳转目标保持一致,别一边跳一边声明另一个地址。
排查时从哪里入手
- 从抓取日志里看搜索引擎实际访问的地址,再和页面里声明的 canonical 做对比,找出明显不一致的栏目。
- 抽查各栏目模板,确认没有统一的错误 canonical,尤其是改版后新上线的模板。
- 观察搜索结果中展示的地址,是否出现大量非预期域名或参数地址。这只是参考,不能作为唯一依据。
- 改版、换域名、栏目合并时,先梳理 canonical,再处理跳转和 sitemap,顺序反了容易留下尾巴。
canonical 是建议,不是强制指令。但把它当成指令来写,通常比把它当成装饰来写要安全。
这份自查不需要一次做完。选一个栏目,把模板、分页、参数三种情况各抽几个页面看一遍,通常就能发现一批共性问题。发现之后优先改模板,而不是逐页手工修补,否则下一次上新还会重复同样的错误。