canonical 只是提示,不是指令
在 HTML 里写一行 canonical,很多人默认它会立刻决定收录哪个地址。实际上它更像一条建议:告诉搜索引擎“这一组内容相近的页面里,我认为哪个是主版本”。搜索引擎会结合抓取到的内容、内链、外链和站点结构来判断,未必照做。所以出现“canonical 指向 A,结果 B 自己也被收录”并不奇怪。要排查的是这条建议为什么没被采纳,而不是反复修改标签本身。
先确认几件事
在动手改之前,按下面的顺序核对一遍,能排除大部分基础问题:
- 页面本身能不能正常抓取:状态码是 200,没有被 robots.txt 挡住,也没有被 meta robots 或 X-Robots-Tag 标成 noindex。
- canonical 目标地址能不能被索引:目标页如果本身是 noindex、404、301 跳走,或者被 robots 屏蔽,那这条 canonical 基本无效。
- canonical 用的是绝对地址还是相对地址:相对路径拼接时容易解析错,尤其是带参数、大小写不统一的地址。
- HTML 里的 canonical 和 JS 注入的 canonical 是否一致:两者不一致时,搜索引擎可能取错那一个。
几种常见的冲突场景
canonical 和 noindex 同时出现
这组信号是矛盾的:noindex 说“别收录我”,canonical 说“把权重给另一个地址”。搜索引擎通常优先处理 noindex,结果是这个页面不收录,权重也不一定按你想的方式传递。如果本意是把页面并入主版本,就不该同时留 noindex。
两个地址互相 canonical
A 页 canonical 指向 B,B 又 canonical 指回 A。这种闭环会让搜索引擎无法判断主版本,最后可能各自保留,也可能自己挑一个。正确的写法是单向指向,全站保持同一个主版本地址。
分页与 canonical 混用
列表第 2 页、第 3 页如果都 canonical 到第 1 页,等于告诉搜索引擎后面几页不用单独收录。这本身是一种取舍,但要注意:分页里往往有通往详情页的内链,如果这些页面不被抓取,新页面的发现路径也会变窄。
改完之后怎么看效果
canonical 调整后,索引不会立刻同步。可以关注这几处:
- 搜索结果里实际展示的是哪个地址,可以用 site: 查询或直接搜索标题确认。
- Search Console 的“网页”报告中,Google 选择的规范网址是否和你的设定一致。
- 该组 URL 的抓取记录,看目标页是否被正常抓取过。
- 站内链接、sitemap、外部链接指向的是不是同一个版本。
如果这几处指向不一致,canonical 想生效就会很慢。把指向先统一,往往比反复改标签更有效。
什么时候不该用 canonical
内容其实不同,只是模板相似,就不要硬指过去。比如不同商品、不同地区的服务页,用户看到的信息并不一样,强行合并会让其中一页彻底失去被检索的机会。这种情况下,更该做的是把每页的内容做差异化,而不是用 canonical 一刀切。
canonical 解决的是“重复版本选哪个”的问题,不是“内容不够好怎么办”的问题。两件事混在一起处理,往往会两边都做不好。