蜘蛛碰到重定向,会继续往下走
蜘蛛请求一个 URL 时,如果服务器返回的是 301、302、307、308 这类响应,它不会就此停下,而是读取 Location 头,再对新的地址发起一次请求,直到拿到 200 或者遇到错误。这条从原始地址到最终地址的路,就是重定向链。
问题在于,链上每一跳都是一次完整的请求过程:解析 DNS、建立连接、发送请求、等待响应。跳数越多,蜘蛛花在同一个 URL 上的时间和资源就越多,留给其他 URL 的余量就越少。
一跳到位和连跳三次,成本差多少
最常见的“三连跳”大致长这样:
- http://example.com/page(HTTP 版本)→ 301 到 https://example.com/page
- https://example.com/page → 301 到 https://www.example.com/page
- https://www.example.com/page → 301 到 https://www.example.com/page/(补结尾斜杠)
对蜘蛛来说,这是四次请求换一个页面。如果站点里有几千个这样的地址,多出来的抓取开销并不小。更麻烦的是,中间任何一跳超时或者返回 5xx,整条链就断了,这一轮蜘蛛什么也没拿到。
相比之下,一跳到位——原始地址直接指向带斜杠的 https 最终地址——只需要两次请求,链路清晰,出错概率也低。
哪些写法容易把链接拉长
- 多层站点级跳转叠加:HTTP 转 HTTPS、裸域转 www、旧域名转新域名各自独立配置,最后叠成一条长链。
- CMS 与插件自动补位:结尾斜杠、语言前缀、index.php、追踪参数,各自触发一次跳转。
- 移动端与 CDN 的额外跳转:设备判断、节点重定向和上面的站点跳转叠加在一起。
- 内链里放短链或跳转链接:用户能到,但蜘蛛要多走几跳,等于给每个内链额外加了一次成本。
- 迁移后残留的临时跳转:当时用的 302 一直没改成 301,或者旧地址跳到了一个还会再跳的地址。
除了浪费时间,还有两个副作用
一是信号指向变得混乱。如果 Sitemap 里提交的是中间地址、canonical 写的是最终地址、内链又用了第三种写法,蜘蛛需要在几个地址之间做判断,最终归到哪个 URL 上并不总是符合预期。
二是抓取记录里的有效入口变少。蜘蛛按 URL 记录抓取结果,链路过长时,部分中间地址可能被单独记录、单独排队,重复占用了抓取额度。
怎么把重定向链收敛到一跳
- 用 curl -I -L 或类似工具抽查常见入口地址,看完整链路和每一跳的状态码。
- 重点检查首页、栏目页、内容页和 Sitemap 中出现的地址,这几类最容易被蜘蛛反复请求。
- 确认最终地址与 canonical、Sitemap、内链使用的地址完全一致,包括协议、主机名和结尾斜杠。
- 把站点级跳转合并成规则:HTTP 和裸域都直接指向最终的 https 加 www 地址,不要在服务端再叠加一层路径重写。
- 迁移完成后,把临时跳转统一改成 301,并定期复查是否出现新的多跳链路。
小结
重定向本身不是错误,很多时候它是必要的。但每多一跳,蜘蛛就要多付一次请求成本,链路越长,遇到超时、5xx 和信号混乱的概率越高。把常见入口收敛到一跳到位,是在不改内容的前提下,对抓取效率比较划算的一次调整。
蜘蛛不介意绕路,但它记得自己绕了多少路。