同一个页面,蜘蛛可能看到好几个地址:带 www 和不带、结尾有没有斜杠、参数顺序不同、路径大小写不一样,再加上各种追踪参数和会话 ID。这些地址如果都返回 200,蜘蛛通常会把它们当作彼此独立的 URL 分别抓取。canonical 的作用就是告诉蜘蛛哪个才是要留下的那一个,但它只是提示,不是命令。
重复 URL 是怎么多出来的
大多数站点的重复地址并不是刻意造出来的,而是几类常见来源叠加的结果:
- 协议与主机名变体:http 与 https、带 www 与不带 www 同时可访问。
- 路径细节:结尾斜杠有无、大小写混用、URL 末尾多出 index.html。
- 参数排列:同一组筛选参数换顺序、自动附加的 utm 追踪参数、会话 ID。
- 功能页副本:打印版、分享版、排序方式、每页条数切换。
这些地址往往内容几乎一致,但蜘蛛要分别请求、分别下载、分别解析。数量一多,抓取配额就被摊薄了。
三种处理方式,力度并不一样
301 永久重定向
力度最强,蜘蛛看到 301 后一般会把旧地址的权重和抓取信号转移到新地址,并在后续抓取中直接使用新地址。适合协议、主机名、大小写、结尾斜杠这类有唯一正确答案的变体。代价是每多一跳就多一次请求,所以尽量不要串成多级跳转。
canonical 标签
力度中等,是建议而非指令。蜘蛛仍会抓取带 canonical 的页面,只是倾向于把信号归到目标 URL 上。它适合内容确实重复、但两个地址都有存在理由的情况,比如同一商品的不同筛选视图、有多语言版本的页面。canonical 写成相对路径、写成带参数的地址、指向一个 404 或重定向目标,都是常见错误。
robots.txt 屏蔽
力度看似最强,实际上限制的是抓取而不是索引。被屏蔽的 URL 蜘蛛抓不到,也就读不到上面的 canonical,外部链接指向它时反而可能造成困惑。一般不建议用 robots.txt 去处理重复内容,更适合处理确实没必要抓取的目录。
写法上容易踩的坑
- canonical 与内链不一致:页面 canonical 指向 A,站内链接却大量指向 B,两个信号互相打岔。内链最好统一用规范形式。
- 分页页面全部 canonical 到第一页:这会让后续页面的内容信号向第一页集中,翻页路径的抓取也可能变少。分页一般让每页 canonical 自身更稳妥。
- Sitemap 里混入非规范地址:Sitemap 是主动提交抓取入口的地方,里面出现带参数的重复 URL,等于自己把重复地址再报一遍。
- canonical 指向被 noindex 的页面:两个信号冲突,蜘蛛需要自行判断,结果往往不如预期。
- 只写 canonical,不做服务端跳转:能跳的重复地址尽量在服务端跳掉,剩下的再交给 canonical,比全压在标签上更干净。
配套要做的几件事
- 在服务器层面对大小写、结尾斜杠、主机名做统一跳转,规则越简单越好。
- 筛选、排序参数如果内容差异不大,可在服务端直接输出规范页,避免为每种参数组合生成独立 URL。
- 外链和站内链接尽量只使用一种形式的地址,减少被动产生的变体。
- 定期翻看服务器日志,看蜘蛛抓取的 URL 中有多大比例属于重复变体。这个比例比抓取总量更有参考价值。
canonical 不是把重复 URL 变没,而是把散落的抓取信号收拢到一个地址上。真正减少浪费的,还是服务端跳转、统一内链和干净的 Sitemap。
最后提醒一点:重复 URL 的处理效果需要一段时间才能从日志里看出来,改完之后不必天天盯着抓取曲线。把入口理干净,让蜘蛛少走几条弯路,已经是有意义的优化。