很多站点在做抓取分析时会发现,日志里同一个内容对应着好几条 URL。它们并不是重复内容,而是同一个地址的不同写法。对浏览器来说差别不大,对蜘蛛来说却是几个独立的入口,每一次都要单独走一遍抓取流程。
蜘蛛只认字符串,不认页面
蜘蛛拿到一个链接,最先判断的是“这个 URL 字符串有没有抓过”。如果没有缓存记录,就排进队列。至于这个地址打开后是不是和站内另一个地址返回同样的内容,要等到抓回来、解析、比对之后才知道。也就是说,只要链接写法不同,前期的请求和下载就已经发生了,后面再发现是同一页,成本也已经付出去了。
最常见的几种“一页多址”
- 末尾斜杠:/about 与 /about/ 在部分服务器配置下都能返回 200。
- 大小写:/News 与 /news 是否等价,取决于服务器、CDN 与路由规则。
- 默认首页文件:/ 、/index.html 、/index.php 同时可访问。
- 协议与域名:http 与 https、带 www 与不带 www,各留了一份。
- 参数顺序与冗余参数:?a=1&b=2 与 ?b=2&a=1,后面再挂一串来源标记。
- 跟踪与展示参数:分享渠道、排序方式、每页条数,往往组合出大量地址。
代价不止是多抓一次
- 抓取预算被摊薄:同一份内容占掉多条 URL 的抓取名额,真正需要更新的页面排队更久。
- 链接权重被分散:站内指向同一页的链接落在不同写法上,信号被拆成几份。
- 数据失真:日志、统计、抓取报告里同一页出现多次,判断哪些栏目被冷落时容易误判。
- 规范地址不稳定:搜索引擎可能在几个写法之间来回切换,展示出来的地址不固定。
收敛到唯一 URL 的几个动作
- 选一个规范写法,其余写法统一 301 到它,并且保持长期有效。
- 页面上保留 canonical,指向规范地址,且与 301 的目标一致,不要互相矛盾。
- 内链、Sitemap、分享按钮、RSS 里的链接全部使用规范写法。内链尤其重要,它决定了蜘蛛日常走的路。
- Sitemap 只提交规范地址,不要同时提交带斜杠和不带斜杠两个版本。
- 参数页分类处理:能合并的合并,纯展示用的去掉,确实需要的保留并给出明确的规范指向或抓取指令。
归一化时尽量用 301,不要用 JS 跳转或 302 临时跳转来顶替,蜘蛛对后两者的处理不如永久跳转干脆;也不要把整类参数用 robots.txt 全部挡掉,挡住抓取的同时,URL 的发现和后续判断也一并被挡掉了。
怎么发现自己站里的重复 URL
- 在日志里搜同一段路径,看是否存在大小写、末尾斜杠不同的抓取记录。
- 检查站点抓取统计里,同一标题是否对应多个地址。
- 抽查内链,尤其是模板生成的链接、面包屑、分页导航。
- 确认服务器在补斜杠或补默认文件时,返回的是 301 还是 302。
归一化不是配置一次就结束的事。新增栏目、改版模板、接入新的统计或推广工具,都可能重新引入新的写法,隔一段时间复查一次比较稳妥。
把 URL 写法收敛好,不会立刻带来什么变化,但它能让蜘蛛的每一次访问都落在真正需要被看到的页面上,也让后续的抓取分析少掉很多噪音。