蜘蛛拿到一個 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 时,這一步最容易漏。
怎么排查
- 從抓取日誌里筛出 3xx 狀態碼的請求,統計哪些地址经常出現;
- 對出現频率高的地址手動跟一次跳轉,记錄跳了几跳、终点返回什么狀態;
- 把终点與 Sitemap、内鏈、canonical 里寫的地址對照,找出不一致的地方;
- 能合並的規則就合並,把两跳压成一跳;
- 更新内鏈和 Sitemap,让入口直接落在终点上。
重定向不是错誤,它是把舊地址接到新地址的正常手段。問题在于鏈條太長、方向不唯一,让蜘蛛把抓取花在了路上。
整理完之後不需要額外的操作,蜘蛛會按抓到的信号逐步調整。观察一段時間日誌中 3xx 請求的比例是否下降,就能判断抓取路径有没有變顺。