蜘蛛碰到重定向,會繼續往下走
蜘蛛請求一個 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 和信号混乱的概率越高。把常见入口收敛到一跳到位,是在不改内容的前提下,對抓取效率比較划算的一次調整。
蜘蛛不介意绕路,但它记得自己绕了多少路。