canonical 标签的作用是告诉搜索引擎“这一组内容相近的页面里,我认为哪个是主版本”。注意是“我认为”——它属于提示(hint),不是必须执行的指令。搜索引擎会结合页面内容、内链、外链、站点地图等信息综合判断。所以出现“写了 canonical 但收录结果和预期不一致”是常见现象,不一定是写错了。
canonical 在做什么,不做什么
它主要影响两件事:一是多个 URL 内容相同时,信号往哪个 URL 集中;二是在搜索结果里优先展示哪个 URL。它不负责阻止抓取(那是 robots.txt 的事),也不负责阻止进入索引(那是 noindex 的事)。把这三件事混在一起用,是很多收录问题的起点。
几种常见的“指向不对”
1. 指向一个不存在或打不开的 URL
canonical 写成了草稿地址、旧路径或拼错的路径,且该地址返回 404 或 5xx。这种情况下,搜索引擎通常不会把信号交出去,而是回到自行判断,收录可能仍停留在原 URL,也可能两个 URL 都不稳定。
2. 全站都指向首页
模板里写死了首页 canonical,导致所有内页都声明“主版本是首页”。这会让内容页彼此难以区分,比较常见的结果是内页收录数量变少,收录集中在少数几个 URL 上。
3. 分页、筛选页互相 canonical
把第 2 页、筛选结果页都 canonical 到第 1 页,本意是收敛变体。但如果这些页面上有独立可索引的内容,全部收敛可能让它们失去被单独收录的机会。要不要收敛,取决于这些页面是否有独立的搜索需求。
4. 同一页面在两个域名或协议上互指
测试域名、CDN 域名、http 与 https 各自都写了指向自己的 canonical,等于没有收敛。需要确认主域名唯一,并让其他变体一致指向主域名。
收录会落在哪个 URL 上
写了 canonical 之后,比较常见的几种结果:
- 按预期收敛:只有主版本 URL 出现在索引里,变体逐步退出。
- 两个 URL 都在索引里:搜索引擎认为两者内容差异足够大,或对 canonical 的信任不足。
- 收录的是被指向的 URL,但内容来自原页面:出现过“收录 A 的地址、展示 B 的内容”这类情况,通常是信号冲突导致。
- 原 URL 仍在索引里,只是展示时替换成主版本:这属于展示层的处理,不代表索引里已经换人。
这些结果之间没有绝对的先后顺序,也没有固定的生效时间,只能通过观察搜索端的表现来确认。
自查顺序
- 确认 canonical 里的 URL 能正常打开,返回 200,且不是重定向链的中间地址。
- 使用不带参数、不带跟踪码的规范地址,绝对路径优于相对路径。
- 核对页面自身是否被 noindex、被 robots.txt 屏蔽,或需要登录才能访问——这些都会让 canonical 失去意义。
- 检查是否输出了多个 canonical,或者 JS 注入的 canonical 与源码里的不一致。
- 看内链和站点地图指向的是哪个 URL。如果这两处和 canonical 说的不一致,先统一。
- 观察目标 URL 是否已被收录、是否有抓取记录,再去判断 canonical 是否生效。
几条可以减少麻烦的习惯
- 一个页面只保留一个 canonical,别让模板和手动配置同时输出。
- canonical 指向的 URL 应当是可抓取、可索引的真实内容页,不要指向列表页或搜索页。
- 同一批内容只保留一套主 URL,参数、大小写、末尾斜杠的处理尽量在服务器层统一。
- 改版换 URL 时,canonical、内链、站点地图、301 尽量同步更新,不要只改一处。
canonical 解决的是“同一份内容该算在谁头上”,不是收录开关。遇到收录不符合预期时,先确认页面能不能被抓、能不能被索引,再回头看 canonical 是否自洽。