canonical 标签的作用是告诉搜索引擎「这份内容应该用哪个 URL 作为代表版本」。它和 noindex、nofollow、robots.txt 不是一类东西,但经常被混在一起讨论。入口页里放了 canonical 指向别的地址,搜索蜘蛛还会不会跟进页面里的目标 URL?答案取决于 canonical 指向谁,以及页面本身还能不能被正常抓取。
先分清 canonical 管的是索引,不是抓取
canonical 属于索引层面的偏好信号。它表达的是「同一份或高度相似的内容,请以我指定的那个 URL 为准」,并不等于命令搜索蜘蛛停止抓取当前页面。搜索蜘蛛通常仍会访问入口页、解析 HTML,并沿页面里的链接继续爬。真正直接阻止抓取的是 robots.txt 的 Disallow,真正让页面不进索引的是 noindex,真正让单条链接不被跟进的是一条链接上的 nofollow。这三者和 canonical 的作用点不在同一层。
三种常见情形,搜索蜘蛛的反应并不一样
情形一:指向同站另一个页面
如果入口页的 canonical 指向同站、内容相近的另一个页面,搜索蜘蛛一般还会抓取入口页,也可能继续跟进页内链接,但入口页本身被单独索引的机会变小。对「发现 URL」这件事来说,链接通路通常还在,只是这个入口页的索引权重被转移了。
情形二:指向外部域名
把 canonical 指向外部域名,等于把这份内容的代表版本让给别的站点。入口页仍然可能被抓取,链接也可能被跟进,但页面被索引的概率明显下降。长期这样写,入口页在站内承担链接枢纽的价值会被打折,不太适合用来做 URL 发现。
情形三:指向自身
canonical 指向自身是最常见的规范写法,等于声明「本页就是正式版本」。它不会拦抓取,也不会挡链接跟进,属于中性甚至正向的写法。
真正会拦住搜索蜘蛛的几件事
- robots.txt 里的 Disallow:直接阻止抓取,页面里的链接也就无从被发现。
- noindex 或 x-robots-tag: noindex:页面不进索引,但抓取和链接跟进通常仍会发生。
- 单条链接上的 nofollow:只影响那一条链接,不影响整个页面的抓取。
- 页面返回 4xx / 5xx:抓取失败,链接自然看不到。
- 需要登录、被 WAF 拦截、JS 报错导致内容为空:也会影响抓取与解析。
canonical 不在这个名单里。把它当成「抓取开关」来处理,往往会误判问题所在。
想把入口页当链接枢纽,写法可以更稳一些
- 入口页的 canonical 指向自身,或者干脆不加 canonical。
- 页面返回 200,正文有实际内容,不要只剩一行链接。
- 链接使用可解析的 a 标签,href 写完整地址,避免纯文本或残缺写法。
- 同一入口页上不要同时出现 noindex 与 nofollow 的叠加限制。
- 入口页之间保持一定差异,不要所有页面除链接外几乎一模一样。
canonical 回答的是「用哪个 URL 代表这份内容」,不是「要不要抓这个页面」。想让搜索蜘蛛跟进链接,先保证它抓得到、解析得了。
排查清单
- 查看页面源代码里的 canonical,确认是绝对地址还是相对地址、指向自身还是别处。
- 用抓取测试工具看搜索蜘蛛实际拿到的 HTML 与渲染结果,确认链接是否可见。
- 翻服务器日志,确认搜索蜘蛛是否访问过入口页,以及是否继续请求了目标 URL。
- 如果入口页的唯一作用就是铺链接、本身不需要被索引,不加 canonical 也可以,别用错写法制造额外噪声。
canonical 写错不会像 robots.txt 那样立刻把搜索蜘蛛挡在门外,但它会把入口页的索引价值悄悄转移走。做 URL 发现时,把「能不能抓到」和「用哪个 URL 代表内容」分开看,很多疑问会自然消解。