为什么一条 canonical 会牵连一组页面
canonical 的作用是让页面自己说明:在若干个内容相近的地址里,哪一个才是主版本。它本身不是强制指令,但写错之后,搜索引擎可能把信号集中到一个不该集中的地址上,结果是一整组页面在索引里表现异常,而不是单个页面出问题。更麻烦的是,这类问题通常不会报错,页面上看不出任何异样。
所以它适合放进站点的例行自查里,尤其是模板改动、批量导入内容、改版迁移之后。
常见的几类写法问题
- 模板写死成固定地址:整站所有页面都输出同一个 canonical,最典型的是全部指向首页。这等于告诉搜索引擎,成千上万个页面其实是同一个页面的副本。
- 自指缺失:详情页写了,列表页、分页、标签页却没写。缺失时搜索引擎只能自己判断,判断结果未必和你的规划一致。
- 指向了不可用的地址:canonical 指向的 URL 返回 404、302、301,或者本身带着 noindex。目标地址自己都不成立,这个声明就没有意义。
- 协议与域名混用:http 页面指向 https,不带 www 的指向带 www 的,或者末尾斜杠写法不统一。看似小事,实际会造成两个版本被反复来回指认。
- 一条页面出现多条 canonical:多来自主题模板、插件、编辑器各自输出一次,搜索引擎通常会忽略全部。
- 由 JS 后写入:如果标签是脚本执行后才插进 head,能不能被读到就取决于渲染结果,稳定性不如直接写在 HTML 里。
按这个顺序走一遍自查
- 抓取页面原始 HTML,确认 head 里存在 canonical,并且只有一条。
- 确认它是绝对地址,协议、域名、路径大小写与当前页保持一致。
- 确认自指:详情页指向自己,栏目页指向自己;分页页是指向自己还是指向第一页,全站策略要统一,不要一半一半。
- 打开 canonical 指向的地址,确认返回 200,且没有被 noindex、没有被 robots.txt 挡住。
- 把 canonical、Sitemap、hreflang、分页链接放在一起看,确认它们没有互相矛盾。
- 抽样覆盖不同页面类型:首页、栏目页、详情页、标签页、搜索结果页、移动端版本,至少各取两三个。
- 改版或目录迁移后,把上面几步再完整走一次,重点看旧地址是否还在被引用。
它做不到的事
canonical 是一种建议,不是重定向。它不能让旧地址失效,也不能把两个主题不同的页面强行合并成一个。多语言、多地区的版本各有各的定位,本质上不该用 canonical 互相指认。低质量页面也不会因为指向了一个好页面就变好。
真正需要转移权重时,应该用 301;需要整组页面退出索引时,应该用 noindex 或 robots.txt。canonical 只处理同一内容存在多个地址这一种情况。
维护节奏怎么定
不需要天天查。把几个触发点记住就够了:模板或主题升级之后、新增一种页面类型之后、批量导入或程序生成内容之后、域名或目录结构变动之后。每次抽检十几个 URL,比隔半年全站扫一遍更容易发现问题,也更容易定位是哪次改动引入的。
顺带把检查结果记在一个表里:页面类型、canonical 目标、是否自指、目标状态码、检查日期。下次改动前后对照一下,能省不少排查时间。