为什么会出现“同一内容多个 URL”
很多站点在开发阶段不会刻意区分 URL 形式,上线后随着栏目增多、参数叠加、域名切换,同一份内容往往会对应好几个可访问地址。对用户来说差别不大,对搜索蜘蛛来说却是几个独立页面:它会分别请求、分别解析、分别安排后续抓取。
常见的重复来源
- 大小写差异:/About 与 /about 都返回 200。
- 末尾斜杠:/list 与 /list/ 同时可访问。
- 参数叠加:?from=xxx、跟踪参数、?page=1 等默认参数。
- 协议与主机名:http 与 https、带 www 与不带 www 并存。
- 索引页与内容页:/article/123 与 /article/123.html、打印版地址。
- 排序与视图参数:?sort=price、?view=list 之类只是展示顺序变化。
抓取分散带来的实际影响
最直接的影响是抓取时间被摊薄。假设一个列表页有 500 条内容,每条内容存在三种 URL 形式,那么蜘蛛要抓 1500 次才覆盖得完,其中三分之二是重复劳动。对更新频繁的站点,这意味着新内容被发现的速度变慢。
其次是日志噪声。同一个页面的抓取记录散落在多条 URL 上,统计访问量、判断哪些栏目被冷落时容易误判。此外,内链如果指向不统一的地址,页面之间的推荐关系也会被分散,不利于蜘蛛理解哪个地址才是主版本。
收敛的处理顺序
1. 先统一站内链接
内链是蜘蛛发现 URL 最稳定的入口。把导航、面包屑、列表页、正文推荐位里的链接统一成同一个形式,是成本最低、见效最直接的一步。相对链接与绝对链接混用时,注意 base 标签和路径拼接是否符合预期。
2. 用 301 把旧形式导向规范地址
对于已经存在并被抓取过的重复地址,用 301 永久跳转指向规范版本,比让它继续返回 200 更明确。跳转链尽量保持一跳,不要 A 到 B 再到 C。
3. canonical 作为补充而非替代
canonical 是一个提示,不是强制指令。它不能替代 301,也不建议跨域名滥用。
如果页面必须保留多个可访问地址,例如分页或多语言版本,可以在页头写 canonical 指向主版本。但如果站内链接本身指向就不一致,canonical 的效果会打折扣。
4. Sitemap 只列规范 URL
Sitemap 里出现重复地址,等于主动引导蜘蛛去抓非主版本。整理一份只包含规范地址的清单,并定期核对是否与站内链接一致。
5. 参数与视图页的处理
对排序、筛选、跟踪类参数,优先考虑在服务器端做规范化跳转,或对无意义参数组合返回 301。确实需要保留的参数页面,用 canonical 指向不带参数的主版本。不建议一律用 robots.txt 屏蔽,因为被屏蔽的 URL 仍可能被其他页面链接出去,蜘蛛只能看到存在却抓不到,无法判断内容关系。
怎么检查是否收敛到位
- 从服务器日志里按 URL 聚合,看看同一路径是否出现多种写法。
- 抽样几个栏目,手动对比站内链接、canonical、Sitemap 三处地址是否一致。
- 观察跳转链长度,确认没有多层重定向。
- 新增栏目或改版时,把 URL 规范约定写进开发检查项。
小结
URL 规范化的目标不是消灭所有参数,而是让蜘蛛在有限时间里把精力放在会变化的正文页上。先统一内链,再用 301 收敛历史地址,最后用 canonical 与 Sitemap 做补充,通常能覆盖大部分重复抓取问题。执行后不必急着看结果,抓取行为的调整往往需要一段时间才会反映在日志里。