canonical 是页面里一行不太起眼的声明,很多模板自动生成之后就再没人看过。它决定了搜索引擎更愿意把哪个地址当作这批相似内容的代表。写对的时候它安静地工作;写错的时候通常不会报错,也不会有任何提示,只是让同一批内容在结果里互相消耗。
它到底在解决什么问题
同一个页面经常有多个可访问的地址:带 www 和不带 www、http 和 https、带尾斜杠和不带、列表页的翻页、带追踪参数的分享链接。这些地址返回的内容基本一致,如果没有明确说明,搜索引擎需要自己判断哪个是主版本。canonical 的作用就是把这一次判断变成明确的声明。
但要注意,它是建议而不是指令。搜索引擎仍然会结合内链、站点地图、重定向等信号综合判断,所以 canonical 应当与这些信号保持一致,而不是互相打架。一边在 canonical 里声明 A,一边把所有内链都指向 B,效果往往适得其反。
常见的几类问题
指向了不存在或会跳转的地址
这是最常见的一种。canonical 写的是 A,但 A 本身 301 到 B,或者 A 早已 404。这种情况下声明基本失效。正确的做法是让它直接指向最终可访问的规范地址,中间不要再经过跳转。
全站套用同一个模板值
有些模板把 canonical 写成了固定的首页地址,结果所有文章都声明自己的正主是首页。这等于让栏目页和详情页主动退出。canonical 应当按页面自身地址动态生成,而不是套一个写死的字符串。
分页与筛选页处理不当
列表第二页的 canonical 如果指回第一页,等于告诉搜索引擎第二页的内容不必单独存在。分页页面更适合使用自指 canonical,或者保留可抓取的独立地址,具体取决于你是否希望它们被单独发现。
跨域声明用得太随意
把内容同步到另一个域名时,用 canonical 做过渡是可以的,但长期两只脚站两个域名容易产生混乱。迁移场景更稳妥的方式仍然是 301 加上页面内链的同步更新。
一份可以照着做的自查清单
- 随机抽取各栏目页、详情页、列表页,查看页面源码中的 canonical 值。
- 确认该地址能直接打开,返回 200,且不发生跳转。
- 确认它与页面自身地址一致,除非确实存在另一个主版本。
- 检查是否被误写为首页、栏目页等不相关地址。
- 检查协议与域名写法是否和站点地图、内链、重定向保持统一。
- 用带参数的分享链接打开页面,看 canonical 是否回到干净地址。
- 对比站点地图中的地址与 canonical 声明是否一致。
- 观察服务器日志里规范地址与重复地址的抓取比例变化。
修改时的几点提醒
调整 canonical 属于影响面较大的改动,不建议一次性全站替换。可以按栏目分批进行,改完后观察一段时间的日志和索引表现,再决定是否扩大范围。
canonical 不能替代重定向。已经确定不再使用的旧地址,仍然应该用 301 处理;canonical 更适合处理两个地址都想保留、但只希望一个被展示的情况。
也不要指望加上 canonical 就立刻见效。它只是把意图表达清楚,最终判断仍由搜索引擎完成,和其他结构性因素一起起作用。
一句话:canonical 的作用是减少歧义,而不是制造新的矛盾。它写的那个地址,应该就是你自己也愿意分享出去的那一个。