蜘蛛抓取一個 URL 时,如果服務器返回 301 或 302,它會顺着 Location 繼續請求下一個地址。這個過程對用戶几乎無感,對蜘蛛却意味着多一次往返。單次跳轉通常可以接受,但当成串的重定向出現时,抓取效率會明顯被消耗。
重定向本身不是错,错在鏈太長
網站迁移、协议切換、域名统一,都离不開重定向。問题不在于“有没有跳轉”,而在于“要跳几次”。蜘蛛每跟一次跳轉,就要重新建立請求、等待响應,日誌里也會多出一條记錄。如果内鏈和 Sitemap 里寫的還是舊地址,蜘蛛每次訪問都要走完整條鏈,長期下来就是持續浪費。
一次重定向,蜘蛛要付出什么
- 多一次 HTTP 請求的等待時間,尤其在响應較慢时叠加明顯;
- 抓取队列里的 URL 狀態會變化,舊地址可能被反复抓取;
- 跳轉鏈中間环节如果返回错誤,蜘蛛可能直接放弃;
- 带參數的跳轉還可能被当成新 URL,增加重复抓取。
301、302、307、308 在抓取中的差別
301 表示永久移動,蜘蛛通常會逐步把索引指向新地址,舊地址的抓取频次會下降。302 表示临时移動,蜘蛛可能繼續抓舊地址,因為它不确定跳轉是否長期有效。307 和 308 會保持原請求方法,主要用于非 GET 场景,普通頁面里不多见。選擇哪種狀態碼,要和實际的迁移意图一致,不要長期用 302 替代 301。
鏈式重定向常见的几種来源
- http 跳 https,同时 www 又跳非 www,叠成两跳;
- 末尾斜杠規則不统一,/page 跳 /page/,再跳一次到最终地址;
- 舊域名整体迁移後,内鏈没有同步更新;
- CMS 插件、CDN、负载均衡各自加了一條跳轉規則;
- 移動端适配或語言切換时,用跳轉代替直接輸出正确頁面。
怎么排查重定向鏈
- 用命令行工具逐层查看响應头里的 Location,確認到底跳了几次;
- 在浏览器開發者工具的 Network 面板里看請求鏈路;
- 翻服務器日誌,找同一個 URL 出現多條 301/302 记錄的情况;
- 检查 Sitemap 和主要内鏈,確認寫的是最终地址而不是中間地址;
- 確認跳轉终点返回 200,而不是又一個跳轉或错誤頁。
把重定向控制在合理范围
多數情况下,一跳到位是可以做到的。把 http 到 https、www 到非 www、末尾斜杠這些規則合並成一次跳轉,内鏈和 Sitemap 直接使用最终 URL,舊地址只保留必要的 301。不要让重定向鏈形成循环,也不要用重定向去掩盖本该返回 404 的頁面。
重定向是桥,不是路。桥太多,蜘蛛也會绕累。
抓取效率是一点点积累出来的。减少每一跳的等待,把入口直接指向最终地址,蜘蛛才能把時間花在真正的内容頁上。