canonical 标签的作用只有一句话:当一个内容存在多个可访问的 URL 时,告诉搜索引擎哪个是主版本。听起来简单,但它出错的方式特别多,而且大多不会报错,只会在索引里慢慢表现成“这个页面好像不太对”。
为什么 canonical 容易出错
因为它通常不是人工写的,而是模板输出的。模板一旦写死,栏目改结构、URL 改规则、换域名,它都不会自动跟着变。再加上它属于“看不见的标签”,日常没人会盯着看,问题往往积累很久才被发现。
常见问题清单
- 指向了一个已经 404 的旧地址;
- 指向的地址本身还要经过 301 才能到达;
- 同一页面输出了两个甚至更多 canonical;
- 分页列表的每一页都 canonical 回第一页;
- 列表页与详情页互相指向,形成回路;
- 写的是相对路径,协议、www 与根域名混用;
- 移动端页面 canonical 指向桌面端,但两边内容并不一致;
- 多语言站点把所有语种都指向主语言版本。
一次能落地的自查流程
- 先抽样。从首页、栏目页、详情页、分页、带参页各挑几个,直接看源码里的 canonical 是什么。
- 再全站导出。用爬虫工具跑一遍,把 URL 与 canonical 两列导出成表格。
- 做比对。把结果分成几类:自引用、指向站内其他页、指向 404 或 5xx、缺失、重复输出。
- 核对一致性。canonical 指向的地址,是否和 sitemap、内链、重定向目标说的是同一件事。
- 修模板而不是修页面。发现问题优先改模板,避免下次更新又回到原点。
判断时可以参照的几条准则
- 用绝对 URL,带上协议和域名,减少歧义;
- 每页只保留一个;
- 自引用是正常且推荐的,不需要刻意去掉;
- 需要整页替换时用 301,canonical 处理的是“同一内容的多份副本”;
- 不要指望用 canonical 掩盖结构问题,它只是一个建议信号。
canonical 是提示,不是命令。搜索引擎完全可以忽略它。如果你需要靠它来“救”一个本该修好的结构,那说明真正的问题在别处。
几个容易忽略的地方
分页是一个典型。列表的第二页、第三页各自有独立内容,把它们全部 canonical 到第一页,等于告诉搜索引擎后面几页不用单独看。除非你确实打算让它们合并,否则保持自引用更合适。
多语言是另一个。hreflang 负责说明语种之间的关系,canonical 负责说明同一语种内的主版本,两者分工不同,不要用 canonical 把不同语种合并成一个。
最后是改版节点。换域名、改 URL 规则、调整栏目结构之后,模板里的 canonical 往往还指向旧地址。把这项检查放进上线清单,比事后翻索引省事得多。
这套自查不需要一次做完全站。先抽样,再导出比对,把明显的矛盾和指向失效地址的情况清掉,通常就能解决大部分问题。