Canonical 标签指 HTML 页面头部的 link rel=canonical 元素,也可以通过 HTTP 响应的 Link 标头声明,用来帮助搜索引擎在一组内容相同或高度相似的多个 URL 里,选出一个代表性的规范版本,整合这些重复 URL 应该获得的排名信号,并减少搜索引擎对重复内容的重复抓取。常见场景包括同一商品页带了不同的追踪参数、或者同一内容存在多个访问路径的情况。

是信号,不是强制指令

理解 canonical 最重要的一点是:它是搜索引擎会参考的信号,不是必须服从的强制指令。Google 可能因为其他信号(比如某个 URL 获得了更多外链、两个版本的内容其实存在细微差异)而最终选择另一个 URL 作为规范版本。

永久性地址变更,重定向通常比 canonical 更合适

对于 HTTP 迁移到 HTTPS、www 和非 www 版本合并这类永久性的地址变更,通常应该用 301 或 308 重定向来处理,而不是只设置 canonical。重定向会把用户和爬虫都实际带到新地址、逐步转移排名信号;canonical 只是一个信号层面的声明,旧地址依然可以被访问,两种场景的解决方式不能互相替代。

常见的配置错误

一个页面上出现多个互相矛盾的 canonical 声明、canonical 指向的目标页面本身又被设置了 noindex 或无法正常访问、或者 canonical 错误地指向了一个内容完全不同的页面,都会造成信号混乱,让搜索引擎难以判断到底该信哪一个。用作 canonical 目标的 URL,应该本身是可访问、可索引、且和当前页面内容相同或高度相似的页面。