搜尋抓取

跳轉鏈與蜘蛛抓取:301、302 背後多走的几步

蜘蛛遇到跳轉时,會先請求原地址,再請求跳轉目标。一跳還能接受,多級跳轉、循环跳轉和長期 302 就會拖慢抓取、消耗预算。本文梳理常见跳轉類型對抓取的實际影响,並给出排查跳轉鏈、把内鏈和 Sitemap 直接指向终点地址的做法。

搜尋抓取

跳轉鏈與蜘蛛抓取:301、302 背後多走的几步

蜘蛛抓取一個 URL 时,並不總是直接拿到頁面。如果這個地址返回的是跳轉,它會先請求原地址,讀到 Location 头,再去請求下一跳。跳轉本身不是错誤,網站改版、协议切換、域名统一都离不開它。問题在于,一條鏈上挂的跳轉越多,蜘蛛花在“路上”的時間就越多。

蜘蛛看到跳轉时會怎么走

面對 301 和 308,蜘蛛通常理解為永久跳轉,會把索引目标逐步轉移到新地址。面對 302 和 307,它會先观察一段時間:如果這個跳轉長期不變,也可能按永久跳轉處理;如果频繁變化,蜘蛛對原地址的信心就會下降。無论哪種情况,蜘蛛都需要額外發起一次請求,才能真正讀到内容。

這意味着,一個跳轉 URL 也會進入抓取队列。它消耗的抓取预算和普通頁面類似,但产出的是一個“去別處”的指令,而不是可索引的内容。

多級跳轉鏈的成本

假设用戶点击的舊地址要经過三次跳轉才能到最终頁,蜘蛛就要發四次請求。常见的叠加场景包括:

  • http 地址先 301 到 https,https 後又跳到带 www 的版本,最後再跳到去掉末尾斜杠的地址;
  • 栏目改版後,舊 URL 指向二級舊 URL,二級舊 URL 再指向新 URL;
  • 移動端地址、AMP 地址或參數版本没有直接指向規范地址,而是先跳到中間頁。

鏈越長,两個問题越明顯:一是蜘蛛到達最终頁面的時間被推迟,二是中間任何一跳出错,後面都到不了。如果某一跳返回 404 或 5xx,前面的跳轉就白做了。

循环跳轉更麻烦:A 跳 B、B 跳 A,蜘蛛走几轮後會放弃這個地址,並在後續一段時間内降低對它的抓取意愿。

容易被忽略的几種跳轉

meta refresh 與 JS 跳轉

這两種方式不是 HTTP 层的跳轉,蜘蛛需要先渲染頁面才能發現。meta refresh 通常能被识別,但如果延迟時間设為 0 以外,處理方式會更保守。JS 跳轉則依赖渲染能力,没有被执行到的脚本,蜘蛛就看不到目标地址。能用 301 解决的,尽量不要用這两種方式代替。

登入、地区與語言選擇頁

有些站点會先把所有訪客跳到地区選擇頁,再跳到具体内容。對蜘蛛来说,這等于在每條 URL 前面加了一站,抓取效率會明顯下降。更稳妥的做法是让内容地址可直接訪問,把選擇逻辑放在頁面内。

怎么排查並收敛跳轉鏈

  1. 抽取一批站内 URL,用 curl -I 或带跟随跳轉的請求查看每一跳的狀態碼和 Location,確認没有三級以上的鏈。
  2. 在服務器日誌中篩選 301、302 记錄,看哪些舊地址仍在被频繁請求,判断是内鏈没改,還是外部連結没更新。
  3. 把内鏈、導航、Sitemap 和 canonical 全部直接寫成最终地址,不要再指向跳轉 URL。
  4. 舊地址做一次性 301 到最终地址,不要“先跳到中間地址,再跳一次”。
  5. 定期复核跳轉規則,刪除已经没必要的舊規則,避免規則之間互相覆盖。

跳轉與抓取效率的關系

跳轉鏈不會直接决定頁面是否被收錄,但它會改變蜘蛛到達頁面的路径長度。對于重要頁面,尽量让蜘蛛一跳直達;對于歷史地址,保留一條清晰的 301 即可。把跳轉当成临时桥梁,而不是長期通道,抓取路径會干净很多。