搜尋抓取

重定向鏈與抓取损耗:跳數叠加、循环跳轉與入口地址的统一

重定向是站点运维的常規手段,但對搜尋蜘蛛来说,每一次 3xx 都意味着多一次請求。本文梳理 HTTP 到 HTTPS、www、尾斜杠等常见跳轉叠加场景,介绍循环跳轉的排查方式,以及内鏈與 Sitemap 如何直接指向最终地址,减少抓取路径上的無谓消耗。

搜尋抓取

重定向鏈與抓取损耗:跳數叠加、循环跳轉與入口地址的统一

把 HTTP 跳到 HTTPS、把带 www 的地址跳到不带 www、把舊域名跳到新域名,這些操作本身都没有問题。問题往往出在它們叠加在同一條 URL 上——蜘蛛從外鏈或歷史记錄出發,要连跳三四次才能真正拿到頁面内容。

一次跳轉就是一次額外的請求

蜘蛛收到 301 或 302 时,需要重新發起一次請求才能得到目标頁。跳數越多,單個 URL 占用的抓取资源越多,抓取节奏也越慢。對于抓取频次本来就有限的站点,這部分损耗並不小,尤其是那些被大量内鏈或外鏈指向的舊地址。

常见的跳轉叠加场景

  • HTTP 跳 HTTPS
  • 带 www 跳不带 www(或反向)
  • 舊域名跳新域名
  • 缺少尾斜杠跳带尾斜杠
  • 移動端 m 站跳主站
  • 大寫路径跳小寫路径
  • 带追踪參數跳纯净地址

單獨看每一條都很合理,但叠加起来就是一條長鏈:http://www.example.com/old-path 先跳 HTTPS,再跳無 www,再去掉尾斜杠差异,最後才落到最终地址。中間每一步都會产生一次响應,也都會被蜘蛛逐次請求。

循环跳轉與跳回原處

循环重定向表現為 A 跳 B、B 又跳回 A,蜘蛛在若干次尝试後會放弃這條路径。更隐蔽的情况是配置冲突:CDN 层把 HTTPS 跳回 HTTP,源站层又把 HTTP 跳向 HTTPS,两邊規則單獨检查都没寫错,合起来却成了死循环。日誌里同一個 IP 反复請求同一批 URL、狀態碼在 301 與 200 之間来回摆動,通常就是這類問题。

301 與 302 的使用差別

永久迁移用 301,临时調整用 302。長期用 302 做域名迁移,會让蜘蛛持續訪問舊地址去確認跳轉關系,延缓新地址的抓取节奏。反過来,把临时维護頁配置成 301,也可能让蜘蛛把临时狀態当成最终狀態来處理。

让入口直接指向终点

减少跳轉最直接的办法,是让所有指向站内的入口都寫最终地址:

  • 内鏈统一使用 HTTPS 與選定的域名形式
  • Sitemap 中只放最终 URL,不放會跳轉的舊地址
  • 面包屑、主導航、頁脚連結指向規范地址
  • 站内搜尋结果、RSS 輸出的連結同样使用最终地址

外鏈無法控制,但站内入口是可以控制的。站内鏈路干净,蜘蛛顺着内鏈爬行时就不會反复触發跳轉。

核對與收敛的顺序

  1. 從服務器日誌中筛出狀態碼為 3xx 的請求,按 Location 目标分组統計
  2. 對跳轉次數超過一次的 URL,画出完整的跳轉鏈路
  3. 检查是否存在循环跳轉或跳回原地址的情况
  4. 優先修正被大量内鏈指向的舊地址
  5. 修正後观察日誌中同一批 URL 的跳轉次數是否下降

處理顺序上,先解决循环和長鏈,再處理單次跳轉;先處理高频入口,再處理長尾地址。

容易被忽略的几處

一是二級域名或区域站的跳轉鏈路,往往比主站更長;二是图片、CSS、JS 等资源的跳轉,虽然不直接决定頁面是否被收錄,但會拖慢渲染與抓取速度;三是移動端适配跳轉,如果 m 站與主站互相跳轉,表現上和循环跳轉非常接近。

重定向本身不是問题,鏈路長期無人打理才是。把站内入口统一到最终地址,剩下的跳轉留给必要的歷史兼容即可。