搜尋抓取

重定向鏈與抓取路径:多跳跳轉會让蜘蛛多走多少路

重定向鏈每多一跳,蜘蛛就多一次請求成本。本文說明一跳到位與多跳跳轉的差別,列举常见的長鏈寫法,並给出用 curl 抽查鏈路、统一最终地址、收敛站点級跳轉的检查步骤,帮助减少無效抓取開销。

搜尋抓取

重定向鏈與抓取路径:多跳跳轉會让蜘蛛多走多少路

蜘蛛碰到重定向,會繼續往下走

蜘蛛請求一個 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 记錄抓取结果,鏈路過長时,部分中間地址可能被單獨记錄、單獨排队,重复占用了抓取額度。

怎么把重定向鏈收敛到一跳

  1. curl -I -L 或類似工具抽查常见入口地址,看完整鏈路和每一跳的狀態碼。
  2. 重点检查首頁、栏目頁、内容頁和 Sitemap 中出現的地址,這几類最容易被蜘蛛反复請求。
  3. 確認最终地址與 canonical、Sitemap、内鏈使用的地址完全一致,包括协议、主机名和结尾斜杠。
  4. 把站点級跳轉合並成規則:HTTP 和裸域都直接指向最终的 https 加 www 地址,不要在服務端再叠加一层路径重寫。
  5. 迁移完成後,把临时跳轉统一改成 301,並定期复查是否出現新的多跳鏈路。

小结

重定向本身不是错誤,很多时候它是必要的。但每多一跳,蜘蛛就要多付一次請求成本,鏈路越長,遇到超时、5xx 和信号混乱的概率越高。把常见入口收敛到一跳到位,是在不改内容的前提下,對抓取效率比較划算的一次調整。

蜘蛛不介意绕路,但它记得自己绕了多少路。