搜尋抓取

多跳重定向:蜘蛛到達最终 URL 的路上會發生什么

蜘蛛請求一個 URL 时,如果拿到的是 301 或 302,它必须再請求一次才能拿到内容。跳轉鏈越長,抓取成本越高。本文說明一跳、两跳、三跳分別意味着什么,同域規范化與跨域迁移的差別,Sitemap 與内鏈该指向哪個地址,以及如何用抓取日誌排查多余的跳轉。

搜尋抓取

多跳重定向:蜘蛛到達最终 URL 的路上會發生什么

蜘蛛拿到一個 URL 之後,第一步不是解析内容,而是發起請求。如果服務器返回的是 301 或 302,它必须再發起一次請求,才能拿到真正的頁面。這個再發起一次的動作,就是重定向鏈對抓取最直接的影响。

一次跳轉:蜘蛛做了什么

服務器返回 3xx 狀態碼,同时给出 Location 头,蜘蛛就把 Location 里的地址当作新的目标再抓一次。中間這些跳轉頁面本身没有可索引的内容,它們只是路上的路标。

問题是路标會占用抓取次數。抓取量是有限的,一個 URL 跳三次才到终点,等于蜘蛛花了四次請求才完成一次内容获取。如果全站大量連結都走多跳,抓取预算會被消耗在跳轉上。

跳几次算多

没有硬性标准,但可以這样判断:

  • 一跳,比如 HTTP 到 HTTPS、补尾斜杠、去掉 index.php,属于常见規范化,成本可以接受;
  • 两跳開始值得排查,通常意味着規則叠了两层,例如先 302 到带 www,再 301 到 HTTPS;
  • 三跳以上基本是配置問题,既浪費抓取,也增加超时和中断的概率。

每一跳都要重新做 DNS、连接和响應,鏈越長,中間任何一环不稳定都會让整條路径失敗。

同域規范化與跨域迁移不一样

同域内的跳轉通常是在做统一:统一协议、统一 www、统一大小寫、统一尾斜杠。這類跳轉只要最终地址唯一且稳定,蜘蛛第二次来就會直接抓终点,因為内鏈和 Sitemap 會慢慢收敛到規范地址。

跨域跳轉,比如換域名、換子域,則要小心。整站迁移时,舊域名上的每條 URL 都應指向新域名上的對應頁,保持一對一的 301,而不是全部 301 到首頁。同时要把内鏈和 Sitemap 更新到新域名,否則蜘蛛會一直從舊地址入口進入,再被跳一次。

Sitemap 和内鏈该寫哪個地址

規則很简單:寫最终地址,不寫跳轉地址。

  • Sitemap 里的 loc 用返回 200 的規范 URL;
  • 站内連結直接指向規范 URL,不要鏈到一個再跳一次;
  • canonical 标簽同样指向規范 URL,並與 Sitemap、内鏈保持一致。

三處不一致时,蜘蛛會收到矛盾的信号,只能自己判断,结果常常是既抓了跳轉地址,又把最终地址当成重复内容。

几種容易踩的坑

把 302 当成固定寫法

302 表示临时跳轉,蜘蛛通常會保留舊地址繼續尝试,不會立刻把抓取轉向新地址。如果實际上是永久變更,應使用 301。

跳轉鏈里带參數

從带跟踪參數的地址跳到不带參數的地址,看起来是清理,實际上會让每條带參數的連結都形成一條獨立跳轉路径。更稳的做法是让參數地址本身直接返回規范内容,或在 robots 規則里明确處理。

循环跳轉

A 跳 B、B 又跳回 A,蜘蛛會停止並把它当作错誤。這類問题一般出現在服務器配置和代碼規則互相冲突时,需要在日誌里看狀態碼和 Location 才能發現。

跳轉目标返回 404

301 指向一個已经不存在的頁面,等于把舊地址的入口也丢掉了。改版整理 URL 时,這一步最容易漏。

怎么排查

  1. 從抓取日誌里筛出 3xx 狀態碼的請求,統計哪些地址经常出現;
  2. 對出現频率高的地址手動跟一次跳轉,记錄跳了几跳、终点返回什么狀態;
  3. 把终点與 Sitemap、内鏈、canonical 里寫的地址對照,找出不一致的地方;
  4. 能合並的規則就合並,把两跳压成一跳;
  5. 更新内鏈和 Sitemap,让入口直接落在终点上。
重定向不是错誤,它是把舊地址接到新地址的正常手段。問题在于鏈條太長、方向不唯一,让蜘蛛把抓取花在了路上。

整理完之後不需要額外的操作,蜘蛛會按抓到的信号逐步調整。观察一段時間日誌中 3xx 請求的比例是否下降,就能判断抓取路径有没有變顺。