跳轉不是一次請求,而是一串請求
很多站点把 301 当成顺手處理的事情:http 跳 https、带 www 跳不带 www、舊目錄跳到新目錄、末尾斜杠再补一刀。對用戶来说,浏览器地址栏一闪就過去了;對蜘蛛来说,每一次跳轉都是一個獨立的 HTTP 請求。蜘蛛需要先拿到 3xx 响應和 Location 头,再對新的地址發起一次請求,逐跳推進,直到拿到 200 才真正開始解析頁面内容。
換句话说,一個要跳三次才能到達的地址,實际消耗的抓取次數是四次:三次 3xx 加一次 200,而不是一次。站点規模上来之後,這種放大效應會變得很可观。
多跳鏈路通常從哪里来
- 协议與主机名叠加:http://example.com 先跳到 https://example.com,再跳到 https://www.example.com,最後才落到具体頁面。
- 结尾斜杠與大小寫:服務器配置把 /a 跳到 /a/,把 /A 跳到 /a,鏈路上又多出两环。
- 迁移残留:老域名、老目錄、老參數地址没有一次性指向最终地址,而是先指到一個中間頁。
- 邊缘层規則叠加:CDN 或反向代理先跳一次,請求回到源站後又跳一次。
- 按 UA 或語言分支跳轉:根據 User-Agent、Accept-Language 决定跳向哪個版本,蜘蛛和用戶可能走到不同终点。
- 短鏈與营销連結:為了統計点击,中間再套一层跳轉頁。
跳轉鏈對抓取路径的三点影响
第一,請求數被放大。每多一跳,就多占一次抓取額度,而這些請求本身並不产出任何可索引的内容。
第二,發現變慢。蜘蛛沿着内鏈或 Sitemap 找到一個地址後,如果它是一條長鏈,那么真正落地頁被確認的時間會被推後,新内容的更新信号也可能因此延迟被感知。
第三,分支不一致容易制造重复地址。同一個頁面因為跳轉條件不同,可能产生 HTTP 版、HTTPS 版、带 www 版等多個中間態,蜘蛛需要額外去判断哪一個是規范地址。
怎么把鏈路看清楚
單條地址的检查
用命令行工具跟踪完整鏈路,逐條记錄狀態碼和 Location 指向,重点關注跳轉次數超過一次、以及中途出現循环或多终点的情况。關键頁面、频道入口頁、Sitemap 中出現的地址,都可以抽样跑一遍。
批量观察
在服務器日誌里篩選 3xx 狀態碼,按 Location 的目标地址聚合,看哪些目标被反复跳轉、哪些鏈路的层級最深。比起盯單個 URL,日誌聚合更容易發現成片的配置問题,比如某條邊缘規則影响了整個栏目。
收口的几個做法
- 让每條鏈只跳一次,直接指向最终地址,不要中途经過過渡頁。
- 全站统一协议與主机名,站内連結、Sitemap、RSS 里直接寫最终形式。
- 检查 CDN、WAF、反向代理层的跳轉規則,避免與源站規則叠加成两跳。
- 迁移时把舊地址一次性映射到最终地址,而不是先跳到中間頁再跳一次。
- 尽量不给蜘蛛單獨設定跳轉分支,让它和用戶落到同一個最终地址。
- 定期复查内鏈與 Sitemap 中的地址,確認返回的是最终態的 200,而不是 3xx。
收口的目标很朴素:把每個 URL 的到達成本压到最低。鏈路短了,同样的抓取額度就能覆盖更多頁面,蜘蛛在站点里的推進也會更顺。
跳轉本身不是問题,問题是同一批地址每次都要多走几步才到终点。