同一篇内容对搜索蜘蛛来说可能并不止一个地址。浏览器的容错能力很强,用户把首字母打成大写、结尾少写或多写一个斜杠、带上几个看不懂的参数,页面照样能打开。但蜘蛛看到的是字符串:字符串不同,URL 就不同,会各自进入待抓队列,各占一次请求。结果是抓取量看着在涨,真正需要更新的页面却迟迟等不到重新访问。
常见的入口不一致类型
多数重复入口不是刻意做出来的,而是拼接习惯加上服务器配置共同造成的。以下几类在日志里最常出现:
- 大小写差异:/About 与 /about 都返回 200,服务器不区分,但两条 URL 字符串不同。
- 尾斜杠差异:/list 与 /list/ 都能打开,内链一处写一种,Sitemap 又写第三种。
- 默认文件名与端口:/index.html 与 /、带 :80 的写法、http 与 https 混用。
- 参数顺序与冗余参数:?a=1&b=2 与 ?b=2&a=1,以及排序、来源追踪类参数。
- 分页参数写法:?page=1 与 ?p=1 并存,第一页又和列表页本身重复。
这些差异单独看都很小,但同一内容若有两三种写法被内链和 Sitemap 同时引用,就会被稳定地重复发现。
为什么它会影响抓取效率
蜘蛛在单位时间内能取的页面数量是有限的。同一内容被拆成几个地址后,抓取预算被平均分掉,真正有内容更新的地址得到的访问次数反而变少。更麻烦的是判断被干扰:后台看到的抓取总量不低,但按内容去核对时,会发现大量请求落在同一个页面的不同副本上。
还有一层隐性问题。如果一个页面的多个副本都能返回 200,蜘蛛无法从响应本身判断哪个是主体,只能依赖 canonical 或跳转来归集。归集信号一旦缺失或互相矛盾,抓取路径就会长期分裂。
怎么核对是否存在重复入口
- 从服务器日志按路径聚合,统计同一个内容出现了几种请求形态,分别对应的状态码是什么。
- 用抓取工具手动模拟:把带斜杠、不带斜杠、大小写变化的版本各请求一次,记下状态码和最终落点。
- 对比内链与 Sitemap 中同一页面的写法,两边不一致是最常见的源头。
- 检查服务端跳转是否稳定,同一非规范地址多次请求后的落点是否始终一致。
核对时以日志为主,页面报告类数据可以作为参考,但不适合当作唯一依据,因为它们的更新有明显的延迟。
收敛的合理顺序
建议先统一站内写法,再动服务端跳转,这样中途不容易产生新的断链。
- 统一内链与 Sitemap:同一页面在所有位置只保留一种写法,这是成本最低、见效最直接的一步。
- 对非规范形式做 301:跳转到唯一的规范地址,不要用 302,也不要跳转链套多层。
- 用 canonical 兜底:指向规范地址,作为跳转失效时的补充,而不是替代跳转。
- 不要用 robots.txt 处理重复:Disallow 只阻止抓取,不传递归集信号,还可能连带影响规范页的发现。
两个容易踩的误区
只看状态码是否正常
301 和 200 对用户来说都能正常访问,但从抓取角度看完全不同。一个把请求导向唯一地址,一个则让副本继续存活。核对时要看的是落点,而不只是能否打开。
把带参数的地址一刀切屏蔽
筛选页、排序页里有一些确实承载独立内容,全部拦掉可能让这部分页面失去发现路径。更稳妥的做法是先按参数类型分类,确认哪些只是装饰、哪些真的区分内容,再分别处理。
规范化的目标不是消灭所有重复地址,而是让蜘蛛用尽可能少的请求,找到唯一需要更新的那一份。
收敛完成后建议再做一次复查:同一内容在日志里的请求形态是否只剩一种,跳转是否稳定返回 301,内链与 Sitemap 是否已经全部切换到规范写法。这些观察比单看抓取总量更有参考价值,也更容易发现新的不一致从哪里冒出来。