做收录核对时经常遇到一种情况:页面 head 里的 canonical 明明指向主版本,搜索结果里出现的却是另一个 URL,或者两个版本轮流出现。这通常不是 canonical 本身失效,而是站内其他信号和它说法不一致,蜘蛛只能按自己看到的证据来判断。
先确认 canonical 的三种写法是否统一
核对之前,把同一个页面的 canonical 值从三个地方分别取出来:服务器返回的原始 HTML、浏览器渲染后的 DOM、以及站点地图里记录的地址。三者不一致,通常说明模板拼接、CDN 改写或前端脚本在中间插了一手。判断标准是协议、域名、大小写、末尾斜杠完全一致,差一个字符就是两个地址。
常见的改写来源包括:HTTPS 与 HTTP 混用、带 www 与不带 www 同时可访问、末尾斜杠由服务器自动补全但模板里没写、以及字母大小写被中间层转换。这些差异单看都很小,叠在一起就足以让规范化失去意义。
容易和 canonical 打架的信号
- 内链:正文和导航里大量链向非规范版本,等于持续在给旧版本投票。
- 站点地图:sitemap 里列的是带参数或带追踪码的版本,canonical 指的是干净版本。
- hreflang 与多语言标注:各语言版本互相指向,却没有一条指回规范页。
- 分页序列:列表页的下一页既是独立 URL,又被 canonical 指回第一页。
- 同页 noindex 与 canonical:一个说别收录,一个说以我为准,结果往往是两条都不生效。
- 重定向链:A 跳到 B,B 又 canonical 回 A,形成一个闭环。
核对顺序建议
- 抽查 20 到 30 个有问题的 URL,逐个记录四件事:返回码、canonical 值、主要内链指向、站点地图中的写法。
- 把不一致的项归类,看是同一种模板问题批量出现,还是个别页面手工改过留下的痕迹。
- 先动信号最集中的那一类,例如先统一内链指向,再等下一轮抓取后观察变化。
- 改动后不要当天复查,按页面类型给一个观察窗口,等蜘蛛重新抓取过一轮再下结论。
- 如果多个变体都没有排名和流量,优先处理有内链、有外链支撑的那一个,其余可以暂时放着。
canonical 是建议而不是命令。它能起作用的前提是站内其他信号不拆台,否则只是多增加了一层噪音。
几个常见误区
- 以为 canonical 写了就等于收录合并完成,忽略索引里可能长期保留旧版本。
- 把 canonical 指向一个本身就不会被收录的地址,反而让主版本更难被确认。
- 为了省事把所有页面 canonical 到首页,属于典型的信号浪费。
- 只改模板不改存量内容,等下一轮抓取时旧页面依旧带着相反的信号。
实际处理时不必追求一次改完。把信号冲突当成一份清单来管理,每轮只收敛一类问题,配合抓取日志和索引状态一起看,比反复修改 canonical 标签更有效。