搜尋抓取

蜘蛛跟不跟跳轉:3xx 鏈路太長时,抓取路径會發生什么

站内跳轉看似無害,但每一次 3xx 都是蜘蛛的一次額外請求。本文從抓取路径的角度拆解跳轉鏈的代價:协议與主机名连环跳、尾斜杠變体、參數回跳、JS 跳轉,以及怎么用日誌和内鏈把鏈路压到一跳以内。

搜尋抓取

蜘蛛跟不跟跳轉:3xx 鏈路太長时,抓取路径會發生什么

站内出現跳轉很常见,https 改造、域名切換、目錄重构都离不開 3xx。但跳轉不是零成本的:蜘蛛每跟一次跳轉,都要重新發起請求、重新讀响應头,必要时還會重做 DNS 與 TLS。鏈路一長,抓取效率就悄悄往下掉。

蜘蛛遇到 3xx 时到底做了什么

蜘蛛請求一個 URL 後,如果收到 301 或 302,它會讀取 Location 头,把目标地址放進自己的抓取队列,然後按节奏再去請求一次。這個過程不是“瞬間跳過去”,而是一次新的抓取任務。對單條 URL 来说,多一跳就是多一次請求;對整站来说,成千上萬個連結都多一跳,消耗就叠加起来了。

一跳的代價,比想象中多

  • 多一次 HTTP 請求,抓取预算按請求計算,不是按最终頁面計算
  • 目标主机不同时,要重新做 DNS 解析;HTTPS 還要重新握手
  • 服務器日誌里多出一條 3xx 记錄,統計时容易被誤算成“已抓取”
  • 鏈路中某一跳超时或返回 5xx,蜘蛛可能直接放弃,终点頁始终拿不到

常见的几種“越跳越長”

协议與主机名连环跳

http://example.com 跳到 https://example.com,再跳到 https://www.example.com,這是三跳,只有最後一跳才算有效抓取。站点若能一次 301 直接指向最终地址,就省掉中間一段。

尾斜杠與大小寫反复跳

/list 與 /List、/list/ 之間互相跳,往往来自服務器配置和代碼拼接規則不统一。内鏈里混着几種寫法,蜘蛛就會把這些變体都走一遍。

參數回跳到干净地址

带跟踪參數的地址先跳回不带參數的地址,表面上是统一了 URL,實际是让蜘蛛多抓一次。内鏈直接寫干净地址會更省事。

JS 跳轉與 meta refresh

這類跳轉蜘蛛不一定跟,或者跟得比 3xx 慢得多。能用服務端 301 讲清楚的事情,尽量不要留给前端脚本。

怎么查自己站上的跳轉鏈

  1. 在服務器日誌里筛 3xx 狀態碼,看哪些路径出現频率高、Location 指向哪里
  2. 抽几個核心 URL 手動跟一遍,數一數经過几跳才返回 200
  3. 检查内鏈與導航,確認它們指向的是终点 URL,而不是跳轉入口
  4. Sitemap 里寫的應该是终点地址,不是需要跳轉的舊地址
  5. 確認鏈路里没有环,A 跳 B、B 又跳回 A 是最糟的情况

跳轉什么时候必须保留

舊地址已经對外發布過、有外鏈指向,這種跳轉要留着,而且尽量用 301 做永久指向,不要中途改来改去。真正该收敛的是“新連結也在走跳轉”這種情况——新生成的 URL 本身就應该是一個能直接返回 200 的终点,不需要经過任何中轉。

跳轉是给舊地址收尾用的,不是给新地址開头用的。

顺手检查的几個细节

把跳轉鏈压短,其實是在替蜘蛛省掉一部分無效往返。除了跳轉本身,也可以顺便看一眼服務器:跳轉响應如果经常慢于正常頁面,或者高峰期有超时,蜘蛛跟到一半登出的概率會變高。抓取路径上的問题往往不是單点,跳轉、响應時間、内鏈寫法经常一起出現,一起處理效率更高。

小结

把跳轉鏈控制在一跳以内,是抓取路径上比較容易做、收益也比較稳的調整。它不需要改模板、不需要動内容,只要让内鏈和 Sitemap 直接指向终点,就能把蜘蛛花在中轉上的那部分時間省回来。