canonical 标签的作用是告诉搜索引擎:这一组地址里,哪个是主要版本。它不强制,也不保证一定被采纳,但它能减少同一篇内容出现多个候选地址的情况。很多站点上线时写了一次,之后改版、加参数、换域名都没有再回头看,问题就留在页面里了。
先弄清楚 canonical 想解决什么
同一个页面往往可以通过多个 URL 访问:带 www 和不带 www、HTTP 和 HTTPS、带跟踪参数、列表页翻页、打印版、排序参数等。如果这些地址都能打开相同或高度相似的内容,抓取资源就会被分散,外链和权重信号也可能被拆开。canonical 就是用来收敛这些信号的。
但要注意,canonical 不是重定向。它不会阻止用户或蜘蛛访问原地址,只是表达一个偏好。所以不要把它当成屏蔽重复页面的唯一手段。
常见的几类错误
自引用缺失或写错
每个正常页面最好都带上指向自己的 canonical。如果模板漏掉了,或者变量取错,可能出现 A 页面 canonical 指向 B、B 又指向 C 的链式情况。建议随机抽一批 URL,直接查看源代码里的 canonical,确认它和当前地址一致。
参数页和筛选页指向不统一
带排序、筛选、分页参数的地址,canonical 应该指向不带参数的主版本,还是保留自引用,取决于这些页面是否有独立价值。没有独立内容的筛选结果,通常指向主列表;有独立搜索意图的,可以保留自引用并把内容做扎实。最怕的是同一类页面一半指向主版本、一半自引用,信号互相矛盾。
分页与 canonical 打架
分页的第二页、第三页,不应该全部 canonical 到第一页。如果每页都有独立 URL 且内容不同,保留自引用更合适。把分页全部指回第一页,容易让后续页面的内容失去被发现的机会。真正需要收敛的是那些内容重复、仅参数不同的翻页地址。
协议和域名版本没统一
网站从 HTTP 切到 HTTPS,或者从非 www 切到 www 之后,canonical 如果没有同步更新,就会出现 HTTPS 页面的 canonical 指向 HTTP 地址的情况。这会让抓取信号绕远路。自查时可以搜索源码,确认 canonical 里用的是最终上线的协议和域名,而不是旧版本。
和 hreflang 互相干扰
多语言站点里,canonical 和 hreflang 要配合。每种语言版本通常 canonical 指向自己,hreflang 再互相指向。如果所有语言版本的 canonical 都指向英文站,其他语言版本就很难被当成独立页面处理。改之前先确认语言目录和 hreflang 的对应关系。
一份可执行的自查清单
- 从 sitemap 或日志里抽 30 到 50 个有代表性的 URL,覆盖首页、栏目页、详情页、分页、参数页。
- 逐个查看源代码中的 canonical,记录它指向的地址。
- 检查 canonical 目标是否返回 200、是否是最终版本,避免指向 301、404 或已下线页面。
- 对比同一内容的不同入口,确认它们是否指向同一个主版本。
- 如果页面是前端渲染,检查渲染完成后的 DOM 里 canonical 是什么,别只看初始 HTML。
- 改完之后保留一份记录,过一段时间再看日志和索引状态是否收敛。
修改时别踩这些坑
- 不要把不同主题的页面互相 canonical,这比缺失更麻烦。
- 不要为了让某个页面“更快被收录”而乱指向,canonical 不是加速工具。
- 不要一次性全站改掉,先小范围测试,确认模板和变量输出正确。
- 如果页面已经通过 301 合并,记得同步检查 canonical,避免两套规则互相矛盾。
canonical 的价值在于表达偏好,而不是替你做决定。页面本身是否重复、是否有独立价值,仍然要先判断清楚。
canonical 标签不需要每天盯着,但它值得在改版、换域名、加筛选功能之后重新过一遍。把它和 sitemap、robots.txt、重定向规则放在同一张检查表里,站点的地址信号会清楚很多。