蜘蛛抓取一個 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 前面加了一站,抓取效率會明顯下降。更稳妥的做法是让内容地址可直接訪問,把選擇逻辑放在頁面内。
怎么排查並收敛跳轉鏈
- 抽取一批站内 URL,用 curl -I 或带跟随跳轉的請求查看每一跳的狀態碼和 Location,確認没有三級以上的鏈。
- 在服務器日誌中篩選 301、302 记錄,看哪些舊地址仍在被频繁請求,判断是内鏈没改,還是外部連結没更新。
- 把内鏈、導航、Sitemap 和 canonical 全部直接寫成最终地址,不要再指向跳轉 URL。
- 舊地址做一次性 301 到最终地址,不要“先跳到中間地址,再跳一次”。
- 定期复核跳轉規則,刪除已经没必要的舊規則,避免規則之間互相覆盖。
跳轉與抓取效率的關系
跳轉鏈不會直接决定頁面是否被收錄,但它會改變蜘蛛到達頁面的路径長度。對于重要頁面,尽量让蜘蛛一跳直達;對于歷史地址,保留一條清晰的 301 即可。把跳轉当成临时桥梁,而不是長期通道,抓取路径會干净很多。