在蜘蛛池里,入口页数量动辄成百上千,很多运营者会把注意力放在链接交换和抓取量上,却忽略了一个更基础的损耗:同一个页面被蜘蛛当成好几个不同的 URL 分别抓取。这类问题不会报错,日志里也全是 200,但抓取量被白白摊薄。URL 规范化要解决的,就是让一个页面只对应一个规范地址。
重复 URL 是怎么产生的
所谓重复,不是内容复制,而是同一份内容有多个可访问地址。蜘蛛按 URL 记录抓取历史,地址不同就会被视为不同页面,于是同一个入口页可能被反复抓取,抓取记录也被拆散。
三类最常见的来源
大小写混用
HTTP 路径在多数服务器上区分大小写,但不少程序在路由层会做不区分大小写的匹配,结果 /Spider/、/spider/、/SPIDER/ 三条地址都能打开同一页。内链里手写不统一,或者模板里大小写不一致,就会自然生成一批重复地址。
末尾斜杠与默认文件
同一个目录通常有四种可访问写法:带斜杠、不带斜杠、显式写 index.html、只写目录名。服务器如果没有做统一跳转,蜘蛛可能把这几种都抓一遍。这个问题的隐蔽之处在于,页面内容和标题完全一样,肉眼检查很难发现。
查询参数
这类最容易被忽略,也最容易规模化。常见来源包括:
- 统计与投放参数,例如 ?from=、?utm_source=;
- 会话类参数,例如 ?sid=、?sessionid=;
- 排序与筛选参数,例如 ?sort=、?order=;
- 分页参数与页码起始值不一致,例如第一页既有 /list 也有 /list?page=1。
对内链来说,只要模板里带上一个参数,全站入口页就会集体多出一份重复版本。
怎么从日志里发现
- 取一段时间的访问日志,筛出蜘蛛 UA 的记录。
- 把 URL 按“去掉查询参数后的路径 + 去末尾斜杠 + 转小写”归并,统计每个规范路径对应了多少个原始地址。
- 对归并结果排序,重点看那些原始地址数明显大于 1 的路径。
- 抽查几条重复地址,确认返回状态码、正文长度和标题是否一致,排除真正的不同页面。
很多时候你会看到某个入口页有七八个抓取地址,而实际内容只有一份,这就是典型的浪费。
可以做的规范化处理
- 服务器层统一跳转:把非规范写法 301 到规范地址,例如统一转小写、统一补斜杠,并且只保留一种。跳转链越短越好,避免多跳。
- 页面层声明:规范版本的页面用 canonical 指向自己,非规范版本不应作为独立页面存在。
- 参数层收敛:能去掉的参数尽量去掉;确实需要保留的排序、筛选类参数,避免写进内链模板,必要时用 robots.txt 屏蔽参数模式。
- 提交层只给规范地址:sitemap 和主动提交里只放规范版本,不要把带参数的地址一起提交。
- 内链统一:全站导航、列表页、正文链接的输出格式保持一致,从源头减少重复地址的产生。
几个容易踩的边界
规范化不是越激进越好。真正承载不同内容的分页、语言版本、地区版本,不应该被硬性合并;参数屏蔽也要先确认没有屏蔽掉必要页面。
URL 规范化能减少重复抓取、把抓取额度留给有效地址,但它只是抓取效率层面的整理工作,并不代表处理后就会被收录或获得更好的排名。
建议把规范化当成一项日常检查:每隔一段时间看一次日志归并结果,发现新的重复模式就顺手处理掉,比一次性大改更稳妥。