做蜘蛛池的人常把精力放在内容、模板和域名上,却很少回头看一件更基础的事:蜘蛛是先看到 URL,再决定要不要抓的。同一个页面,如果服务器允许它同时以 /Page、/page、/page/、/page?from=abc 四种形态返回 200,那么在蜘蛛眼里这就不是一条地址,而是四条。抓取预算没有变,能用来发现新链接的次数却先少了一截。
URL 形态先于内容被判断
蜘蛛的调度队列里存的是 URL,不是页面。去重、排期、回访频率,都建立在 URL 这一层。内容完全相同的两页,只要地址不同,蜘蛛就得各自抓一次才能确认它们是不是一样。对站点规模不大的普通站,这点损耗可以忽略;对批量生成入口页的蜘蛛池,它会按模板产量成倍放大。
大小写与结尾斜杠:同一页面,多种写法
- 路径大小写:/List 与 /list 在多数服务器上是两条 URL,除非系统做过统一处理。
- 结尾斜杠:/page 与 /page/ 常被当成两个地址,返回的内容却一模一样。
- 默认文件:/page、/page/、/page/index.html 同时可达,等于给蜘蛛开了三条入口。
- 协议与主机名:http 与 https、带 www 与不带 www,若没有 301,会各自累积各自的记录。
这些变体单看都不致命。麻烦在于入口页是模板批量出来的,模板里只要有一处没收敛,所有页面都会带上同样的毛病。日志里看着蜘蛛来访量不低,实际覆盖到的独立地址却不多,这就是典型症状。
查询参数是最容易失控的一段
排序、筛选、分页、来源跟踪,这些参数往往能无限组合,落地内容却只有一份。蜘蛛顺着站内链接往下爬,很快会撞上大量内容相同、URL 不同的地址。更糟的是参数可能被外部链接带进来,你甚至不知道蜘蛛是从哪条路径爬进这堆地址的。
处理思路大致分三层:
- 能静态化就静态化,把筛选和排序尽量放在前端交互里,不让它生成新的 URL。
- 确实需要参数的,用 robots 规则或服务端逻辑限制组合爆炸的入口,只放行必要的参数形态。
- 对已经存在的重复形态,用 301 把旧形态收拢到主版本,再用 canonical 做补充说明。
canonical 是给蜘蛛的提示,不是命令。真正起作用的,还是服务器不要用 200 把同一份内容发到很多条 URL 上。
动态 URL 与伪静态
伪静态不是必须的,但它能把参数形态固定下来。如果入口页本来就由程序按 ID 生成,把 ?id=123 改写成 /p/123.html 这类稳定形式,至少让地址的总量是可枚举的,而不是随参数组合飘移。要注意的是:改写之后旧形态仍可能被外部引用,所以 301 要一起做,否则只是多了一套地址。
一份可以落地的检查清单
- 列出入口页模板可能产生的全部 URL 变体,包括大小写、斜杠、默认文件、协议与主机名。
- 为每种资源确定唯一形态,其余形态统一 301 到它。
- 抽查服务器返回码,确认变体没有全部返回 200。
- 翻访问日志,统计蜘蛛抓到的 URL 里有多少是同一内容的重复形态。
- 模板每次改动后重跑一遍,别只在建池时检查一次。
把路修平,不承诺结果
URL 形态不是玄学,它是蜘蛛认识一个站点的第一层信息。把这一层收干净,抓取预算才更可能花在真正需要被发现的新地址上。至于最终是否收录、收录多少,仍取决于内容质量与站点整体状态,规范化只是把路修平,不能替你把车开到终点。