做站内巡检时,经常会看到这样一组日志:明明是同一个页面的内容,在日志里却对应着好几条不同的 URL。它们全都返回 200,页面长得一模一样,但蜘蛛每访问一次就计一次抓取。时间长了,这些重复写法会悄悄占掉一部分抓取量,也让日志统计变得很难读。
这个问题多半不是蜘蛛造成的,而是站点自己没有把 URL 收敛到一个规范版本上。下面按常见情形拆开说,再讲怎么处理。
一个页面被拆成多条 URL 的常见情形
尾斜杠的两种写法
/about 和 /about/ 在很多服务器配置下都能正常打开。如果服务器对两者都返回 200,蜘蛛就会把它们当作两条独立 URL 分别抓取,即使内容完全相同。理想状态是其中一个返回 301,跳到另一个。
大小写不一致
/Product/123 和 /product/123 在 Linux 服务器上是两个不同的路径。如果程序内部把两者都路由到了同一篇文章,那么只要站内或外链里混用了两种写法,日志里就会出现两条 URL。
默认文件名与目录形式
/index.html、/default.aspx 与 / 这三者,在不少站点上同时可访问。静态站和早期 CMS 尤其容易出现,蜘蛛往往先抓到带默认文件名的版本,之后再从别处抓到目录版本,两条都进队列。
协议与主机名
http 与 https、带 www 与不带 www,如果四种组合都能打开且不跳转,就会形成最多四条入口。这种情况通常出现在协议切换或换域名的过渡期,处理不及时会长期存在。
参数顺序与无意义参数
?a=1&b=2 和 ?b=2&a=1 内容一致但字符串不同;再加上会话 ID、来源追踪参数,一个页面很容易变出十几条写法。参数顺序可以在服务端做归一化,追踪参数则更适合在页面输出链接时就避免。
为什么要收敛:三个实际影响
- 抓取量被摊薄。重复 URL 占用的抓取次数,原本可以分配给真正需要更新的页面。
- 链接信号分散。指向同一内容的内部链接和外部链接被拆到多个地址上,蜘蛛也更容易在不同版本之间来回切换。
- 日志失真。统计某个栏目被访问了多少次、哪些页面长期没人来,都会因为 URL 变体而算不准。
怎么收敛
- 先确定一个规范版本。通常选 https、带或不带 www 中的一个,目录页面统一带或不带尾斜杠,全站保持一致即可,不必纠结选哪种。
- 用 301 而不是 302。301 表达的是长期迁移,302 容易被理解为临时跳转,蜘蛛可能保留原地址继续访问。
- 内链统一写法。导航、正文、分页、面包屑里出现的链接,全部指向规范版本,不要东一条西一条。
- Sitemap 只放规范 URL。提交的地址应与页面实际规范地址一致,避免 Sitemap 自己制造重复入口。
- canonical 作为辅助,不作为主力。它可以帮助蜘蛛理解首选版本,但无法替代服务器跳转;如果两种手段结论冲突,反而会让抓取行为更不稳定。
- 服务器层面处理。在 Nginx 或应用路由层做统一重写,比在模板里逐条改链接更彻底,也更不容易漏。
怎么检查有没有漏
比较省事的办法是定期做一次日志聚合:按路径分组,把大小写、尾斜杠、默认文件名归一之后再统计访问次数,看是否存在同一内容对应多条 URL 的情况。同时用一次全站抓取,观察有多少条 URL 的最终落点是同一个地址。
URL 收敛不是一次性任务。改版、换域名、新增栏目、换 CDN,每一步都可能重新引入新的变体,所以更适合放进固定的巡检清单里。
收敛之后,抓取量并不会立刻变多,但日志会干净很多,也更容易判断哪些页面是真的长期没人来。对于站点运营来说,这份干净的日志本身就是后续优化的前提。