很多站点在日志里会看到这样一种情况:明明只做了一个详情页,蜘蛛却抓了三四条地址,内容一模一样,只是大小写、斜杠或者参数顺序不同。这不是蜘蛛多事,而是这些 URL 在它眼里确实是不同的地址。
蜘蛛判断是不是同一个页面的依据
蜘蛛的待抓队列是按 URL 字符串去重的。它不会先抓回来看看内容再决定要不要跳过——只要字符串不同,就当成新地址排进队列。至于两个 URL 是不是同一个页面,它只能靠页面里的 canonical、站内跳转以及自身的内容比对去判断,判断错了的代价由站点承担。
最常见的几种重复形态
大小写与末尾斜杠
/Article/123 和 /article/123 在很多服务器上都能返回 200,但它们是两个字符串。/list 和 /list/ 同理。如果服务器不做统一跳转,蜘蛛会把两边各抓一遍,内容再比对一次。
参数顺序与无用参数
?a=1&b=2 与 ?b=2&a=1 指向同一份内容,对蜘蛛却是两条 URL。再加上排序、每页条数、来源渠道参数,一个列表页很容易派生出几十条地址。
编码与追踪参数
中文参数被编码成 %E4%B8%AD 还是保留原样、路径里多余的 ./ 或 //、跟踪会话用的 sid,都会衍生新地址。这类 URL 往往还能正常返回 200,进一步坐实了它是一条独立页面。
先确认有没有真的被重复抓
别急着改代码,先用日志核对:
- 把同一路径的多种写法筛出来,看各自被抓的次数和时间分布;
- 看这些重复抓取占了多少比例,尤其是列表页和筛选页;
- 观察重复 URL 是否也被收录,是否在结果里互相竞争。
如果重复量很小,处理优先级可以往后放;如果列表页参数组合动辄上千条,就该动手收敛了。
收敛的思路
- 服务器层统一。用 301 把大小写、末尾斜杠、多余参数归到唯一形态。跳转要一步到位,别串成链。
- 站内链接只输出一种写法。模板、面包屑、分页、分享按钮都指向规范地址,别让不同模块各写各的。
- canonical 兜底。页面上明确声明规范地址,对已经散出去的旧写法也有一定补救作用。
- 参数做减法。无意义参数不要出现在链接里,渠道追踪参数交给前端或统计脚本处理,别写进 href。
- robots 与 noindex 慎用。拦截不想抓的参数组合时要小心,别连带把正常路径也挡在外面。
规范化的目标是让每条内容只有一个可以稳定抓取、稳定指向的地址,而不是把所有变体都藏起来。藏得太多,蜘蛛可能连正主都找不到。
小结
URL 规范化听起来是技术细节,实际影响的是抓取预算和收录质量。把同一份内容的地址收敛成一条,蜘蛛省下的抓取次数就会用在真正的新页面上。这件事不需要复杂方案,多数情况下从跳转规则和模板链接两处入手就能看到变化。