站点地图(Sitemap)和页面 canonical 都在向搜索蜘蛛表达同一件事:这个地址值得抓取、应当被当作正式入口。但两者并不总是同步维护,改版、分页、参数化调整之后,经常出现 Sitemap 里写 A 地址、页面 canonical 指向 B 地址的情况。蜘蛛拿到两份互相矛盾的信号,通常会选一个继续抓,另一个逐渐减少访问。这个过程不会报错,只会表现为某些入口慢慢没人来。
先判断信号是不是真的冲突
并不是所有不一致都算问题,需要先区分三类情况。
- 等价不一致:只差结尾斜杠、大小写、http 与 https、www 前缀。这类属于规范化层面,会带来重复入口,但可以通过统一跳转解决。
- 归属不一致:Sitemap 写的是列表页,canonical 指向详情页或聚合页,两者内容并不相同。这类属于入口归属判断错误。
- 过期不一致:页面已经下线或改版,Sitemap 仍是旧地址,canonical 已经换成新地址。这类是维护滞后。
把这三类分开,后面的处理方式差别很大,先统一归类再动手。
核对顺序:从声明到落地
- 抽样子集:从 Sitemap 里按栏目各抽 20 到 50 条,不必全量,覆盖主要目录即可。
- 取页面 canonical:抓取页面源码,记录 canonical 的 href 值,注意区分 head 里的声明和响应头里的 Link 声明。
- 比对是否自洽:Sitemap 地址与 canonical 地址去掉协议、域名、结尾斜杠后是否一致,不一致就进入下一步。
- 看服务器日志落地:在访问日志中筛选蜘蛛 UA,看它实际请求的是哪个地址、返回什么状态码、是否发生跳转。
- 看跳转链:如果 Sitemap 地址会 301 到 canonical 地址,说明两处声明其实一致,只是入口绕了一步;如果两者各自返回 200,就是真正的一页两入口。
- 确认收录归属:在搜索后台查看这两个地址的收录与展示情况,判断搜索引擎最终选择了哪一个。
常见成因
- 改版后栏目路径变化,Sitemap 生成脚本沿用旧规则,页面模板已经更新。
- 分页与筛选参数页被写进 Sitemap,而页面自身 canonical 指向第一页。
- 多域名或多语言站点,语言选择逻辑与 Sitemap 域名配置不统一。
- 内容聚合页与原始详情页互相 canonical,形成 A 指 B、B 指 A 的循环。
- Sitemap 由第三方工具生成,与站内模板维护在不同节奏上。
处理原则
优先让两处声明指向同一个地址
大多数情况下,正确做法是修改 Sitemap,让它输出与 canonical 一致的地址,而不是反过来改 canonical 去迁就 Sitemap。canonical 是页面级别的判断,更贴近内容本身;Sitemap 是站点级别的清单,改起来成本更低。
能跳转就不要两处并存
如果旧地址确实需要保留对外可见,用 301 指向正式地址即可。Sitemap 里只保留最终地址,避免把跳转前的地址继续提交。
发现循环 canonical 先断链
A 指 B、B 指 A 会让蜘蛛无法确定归属,通常结果是两个地址的抓取频率都下降。保留一个作为自指向,另一个改为 301 或直接下线。
核对时以日志为准,不要只看页面源码。源码可能被缓存或由前端渲染,日志里的请求记录才是蜘蛛实际走过的路径。
核对完成后要留下记录
建议把这三项记在同一份表里:Sitemap 地址、canonical 地址、日志中实际抓取地址与状态码。下次改版或调整脚本时可以对照,避免同一类偏差反复出现。入口数量变少不等于流量一定下降,关键看保留下来的是不是页面真正应该被访问的那个地址。