重定向不是問题,鏈式重定向才是
蜘蛛請求一個 URL,服務器返回 301 或 302,並在 Location 头里给出新地址。蜘蛛不會直接拿到頁面内容,而是需要再發起一次請求。每一次跳轉,都相当于在抓取队列里多走了一步。對于單個頁面来说,多一次請求也许不算什么;但当成千上萬的 URL 都经過两三次跳轉,抓取资源就會在中間环节被消耗掉。
更關键的是,URL 發現和抓取是两條线。内鏈、Sitemap 让蜘蛛知道某個地址存在,但真正抓到内容,還要看這個地址能不能在合理步數内到達最终頁面。如果入口 URL 總是跳来跳去,最终頁面的复查节奏也會被拖慢。
哪些跳轉方式容易拖慢抓取路径
- 多級鏈式跳轉:A 跳 B,B 跳 C,C 才到最终頁。每多一級,就多一次請求,蜘蛛可能在中途降低優先級。
- 長期使用 302:302 表示临时跳轉,蜘蛛會保留原 URL 並反复回来確認。如果站点已经永久迁移,應该用 301 明确告知。
- 循环或死循环跳轉:A 跳 B,B 跳回 A,蜘蛛會在這组地址上反复试探,最终可能放弃。
- 跳轉到無關頁面:比如所有舊連結都 302 到首頁,蜘蛛拿到的不是原内容,URL 發現的意义就被削弱了。
- 协议、域名、端口多重跳轉:http 跳 https,再跳 www,再跳带斜杠版本,看似規范,實际上让抓取路径變長。
- 跳轉目标本身不可抓:最终地址返回 404、软 404 或需要登入,前面的跳轉就白費了。
跳轉深度對 URL 發現的實际影响
從蜘蛛视角看,一個 URL 從被發現到被真正抓取,中間要经過排队、DNS、连接、請求、响應等环节。重定向會插入額外的請求轮次。跳轉深度越深,單次抓取的成本越高,蜘蛛在同等抓取額度下能覆盖的 URL 就越少。
這不意味着所有重定向都必须消灭。站点改版、HTTPS 迁移、域名合並时,301 是必要工具。問题在于鏈式跳轉和長期临时跳轉。理想情况是:内鏈、Sitemap、canonical 都直接指向最终 URL,舊地址只保留一條到最终地址的 301。
重定向本身不是错誤,但鏈式重定向是抓取路径上的摩擦。能一步到位,就不要让蜘蛛走三步。
把抓取路径收口到最终地址
- 统一主域和协议:确定一個首選版本,其他版本用 301 一次性跳過去,不要层层嵌套。
- 站内連結直接寫最终 URL:導航、面包屑、正文内鏈、分頁連結都指向最终地址,避免让蜘蛛從舊地址進入。
- Sitemap 提交最终 URL:Sitemap 里出現的應该是可抓取、可返回 200 的地址,不要放跳轉地址。
- canonical 與最终 URL 一致:如果頁面有多個入口,用 canonical 指明主版本,同时确保主版本不依赖跳轉。
- 用日誌检查 3xx:在抓取日誌里筛出 301、302、307、308,观察哪些 URL 经常以跳轉狀態被請求。如果某個舊地址频繁出現,說明還有内鏈或外鏈在指向它。
- 定期清理重定向規則:迁移完成後,检查是否留下多級規則,能合並的合並,能刪除的刪除。
观察與調整的节奏
重定向問题不會立刻让抓取量暴跌,但會在 URL 發現和复查上形成慢性损耗。可以每月看一次抓取日誌里的狀態碼分布,重点關注 3xx 占比和跳轉鏈長度。如果發現大量 URL 经過两跳以上才到最终頁,優先從模板和内鏈入手,把入口改到最终地址。
服務器稳定性、Sitemap 质量和内鏈结构决定蜘蛛能不能顺利找到 URL,而重定向鏈决定它找到之後要走多遠。把跳轉路径缩短,本质上是把抓取額度留给更多有價值的頁面。