搜尋抓取

重定向鏈有多長:蜘蛛為一個頁面要跳几次

站内留下 301 很正常,但跳轉叠成鏈條後,蜘蛛要發出多次請求才能拿到一個頁面,時間、超时風險和抓取額度都會被消耗。本文梳理多跳的常见组合、301 與前端跳轉的区別,以及用請求測試、抓取日誌和 Sitemap 查出並缩短鏈條的顺序。

搜尋抓取

重定向鏈有多長:蜘蛛為一個頁面要跳几次

站内出現 301 很常见,換域名、換协议、加 www、調整目錄结构,都會留下跳轉。單看一次跳轉没什么問题,蜘蛛能跟過去。麻烦的是鏈條:当 A 跳到 B、B 又跳到 C,蜘蛛為了拿到一個頁面,要發出三次請求,中間任何一环慢一点、错一点,這條路径就可能断在半路。

一次跳轉,蜘蛛要付哪些成本

把重定向看成“多花一次請求”是不够的,它牵扯到几件事:

  • 請求次數:每次跳轉都是一次完整的 HTTP 往返,換了主机名還要重新做一遍 DNS 解析和连接。
  • 時間叠加:單跳 200ms 不顯眼,三跳就是 600ms 以上,還不算排队等待。
  • 超时窗口:抓取器對整條鏈路通常有時間上限,鏈路越長,越容易在中途被放弃。
  • 抓取額度:跳轉請求同样占用站点被分配的抓取预算,最终頁面的抓取机會被稀释。

容易被忽略的多跳组合

多數多跳不是一次配置出来的,而是几次改動叠加的结果,常见的有:

  1. http://example.com/page 跳到 https://example.com/page,再跳到 https://www.example.com/page,协议和主机名各跳一次。
  2. 舊域名跳到新域名,新域名又跳到带尾斜杠的規范地址,域名和路径各跳一次。
  3. 目錄改名後,老目錄跳新目錄,新目錄里的連結又指向另一個別名。
  4. CDN 或负载均衡层再做一次跳轉,站内配置里看不出,實际路径比预期多一跳。
  5. 大小寫或參數顺序不一致,被服務器跳轉到“正确”版本。

這些鏈條單看每一环都正常,合起来就是用三四次請求換一個頁面。

301、302 與前端跳轉的差別

301 和 308 表示永久,302 和 307 表示临时,蜘蛛對两者的處理倾向不同:临时的跳轉更可能被反复確認,永久跳轉則更容易被替換成最终地址。更需要留意的是前端跳轉——meta refresh 和脚本里的 location.href,蜘蛛不一定都會执行,即使执行,也要先完成頁面渲染,成本和不确定性都更高。能用服務端狀態碼表達的跳轉,尽量別交给前端。

怎么把鏈條查出来

  1. 對重点 URL 跑一遍 curl -IL 之類的請求,把每一跳的狀態碼和 Location 打印出来。
  2. 在抓取日誌里筛 3xx 狀態,統計哪些地址反复出現。
  3. 检查 Sitemap:放進去的應该是最终地址,而不是需要跳轉的舊地址。
  4. 抽查站内連結,尤其是導航、面包屑和正文里仍然指向舊路径的那些。

缩短鏈條的處理顺序

  • 先让内鏈和 Sitemap 全部指向最终地址,這一步收益最直接。
  • 把两次跳轉合並成一次,例如 http 直接跳到 https://www 版本,中間不再经過 https:// 裸域。
  • 跳轉的终点要是返回 200 的同主题頁面;跳到首頁或 404,會被判断為無效路径。
  • 隔一段時間复查一遍,避免舊跳轉一层层叠加成新的鏈條。
跳轉本身不會让頁面掉出抓取范围,但每一跳都在消耗蜘蛛的時間和額度。把鏈條压到一跳以内,是成本最低的調整之一。