站点做改版、換域名、上 HTTPS、统一带 www 或不带 www 的寫法时,重定向几乎不可避免。單跳 301 属于正常且被推荐的配置,問题出在“跳一次再跳一次”的鏈式结构、跳轉類型混用,以及跳向無關頁面。這些情况不會立刻让頁面消失,但會让抓取在入口层多绕路,预算被消耗在不产生新信息的請求上。
重定向在抓取流程里發生了什么
蜘蛛拿到一個 URL 後,會先請求它,讀取响應头。如果是 3xx,它需要记錄目标地址,再發起一次請求,才能拿到正文和其中的連結。跳一次是成本,跳三次就等于把一次抓取變成四次請求。對單條 URL 来说不算什么,但如果全站導航、Sitemap、外鏈都落在需要多跳的地址上,累积起来的開销就很明顯。
更麻烦的是入口發現:只有当蜘蛛真正取到最终頁面的 HTML,頁面里的連結才會進入待抓队列。跳轉鏈越長,中間任何一环超时、返回错誤或指向 404,鏈條後面的頁面就都不會被發現。
常见需要核對的重定向形態
- 鏈式跳轉:A→B→C,常见于先跳 HTTPS 再跳 www,或舊域名先跳新域名再跳路径。
- 跳轉類型混用:永久迁移用 302 或 307,蜘蛛按临时跳轉處理,可能仍保留舊 URL 的抓取與展示。
- 跳到無關頁面:404 頁面被 302 送到首頁,或已下架商品跳到分類頁,容易形成大量软着陆。
- 循环跳轉:A→B→A,蜘蛛最终只能报错放弃,頁面長期不被取到。
- 客戶端跳轉:meta refresh 或 JS 跳轉,首屏 HTML 里可能没有目标地址的可解析連結。
- 协议與主机名多次切換:http→https→带 www→带尾斜杠,一次請求走完四跳。
建议的核對顺序
- 用爬虫工具或命令行批量取全站入口 URL 的响應头,记錄狀態碼與 Location。
- 把 Location 再取一次,看是否還有 3xx,直到出現 200 或 4xx,統計跳轉次數分布。
- 重点检查跳轉两次以上的 URL,判断是配置遗漏還是歷史遗留。
- 比對 Sitemap 與内鏈:如果里面寫的是舊地址,把声明改成最终地址。
- 检查 robots.txt、canonical、Sitemap 中的地址是否與最终落地地址一致。
- 確認跳轉類型:永久迁移用 301/308,临时活動才用 302/307。
日誌里怎么看
抓取日誌中,如果大量 301、302 集中在同一批路径,且這些路径的請求量明顯高于實际頁面數,說明站内或站外還在用舊地址。可以按狀態碼分组,看 3xx 請求占比,再拉出對應的来源頁,找到是谁在持續輸出舊連結。
判断标准很简單:一條 URL 從被請求到拿到正文,理想情况只需要一次跳轉,而且這一跳應该指向最终地址。
收鏈时的几個操作
- 把 http、https、www、非 www 的四種组合收敛到一種,其余全部一跳直達。
- 舊路径退役时,尽量直接跳到新路径,不要先跳首頁再让用戶自己找。
- Sitemap 只提交最终地址,不要提交會跳轉的 URL。
- 分頁、篩選參數頁如果有跳轉,確認跳轉後仍能被正常抓取。
- 改完跳轉後,观察一段時間内 3xx 請求占比是否下降,最终頁面的抓取量是否回升。
重定向本身不是错誤。把跳轉控制在必要范围内、让每個入口一跳到位,才是减少抓取浪費的關键。