蜘蛛遇到 3xx 时會做什么
主流搜尋引擎蜘蛛在抓取时會對 301、302、307、308 等狀態碼發起跟随請求,最终拿到狀態 200 的頁面内容。這個過程對用戶是無感的,但從抓取角度看並不免費:每一次跳轉都是一次獨立的 HTTP 請求,占用该站点的抓取配額,也拉長單次抓取耗时。跳數越多,蜘蛛在同一個入口上花的预算越多,能分给其他頁面的次數就越少。
另外,蜘蛛通常只把最终落地頁当作有效结果,中間那些跳轉 URL 很少被当成獨立頁面收錄。也就是说,一條三跳的重定向鏈,等于你用三個 URL 的抓取成本,換来一個頁面的内容。
多跳鏈最常见的几種形態
- HTTP 到 HTTPS、再到 www:协议和主机名各改一次,一條鏈就两三跳。
- 舊域名跳新域名、再跳带尾斜杠版本:改版或換域名时没做一步到位。
- 短鏈、跟踪連結跳落地頁:對外投放會批量产生這類中間 URL。
- 按 UA 判断的移動端跳轉:同一 URL 對不同 UA 返回不同的跳轉目标。
這些形態單獨看都不算错,但叠加起来就容易出現 跳轉鏈過長、跳轉目标不一致 的問题。建议在服務器配置层把 HTTP 到 HTTPS、非 www 到 www 的規則合並成一次跳轉,直接指向最终 URL。
循环和断鏈:比多跳更嚴重
A 跳 B、B 又跳回 A 的循环,會让蜘蛛在同一個閉环里反复請求,最後放弃這條路径。日誌上往往表現為同一组 URL 在短時間内被高频訪問,狀態碼全是 3xx,没有 200。另一種情况是跳轉终点落在 404、410 或者 noindex 頁面,蜘蛛跟到底却拿不到可用内容,這條路径上的 URL 發現就断了。
排查建议:先看抓取日誌里 3xx 的占比和出現频率,再抽样几條鏈用 curl -I -L 或浏览器網絡面板確認跳數,重点检查是否存在循环和死路。
相對連結的解析基准是最终 URL
這一点经常被忽略:如果頁面 A 通過 301 跳到頁面 B,而頁面 B 里用的是相對連結,蜘蛛會以 B 的地址作為解析基准,而不是 A。如果两處目錄层級不同,相對連結很可能指向意料之外的位置,凭空多出一批無效 URL。做跳轉时,尽量让落地頁使用完整路径或根相對路径,减少歧义。
301 與 302 的長期差別
301 一般被理解為永久迁移,302、307 被理解為临时。短期活動頁、临时维護用 302 没問题;但如果一個 URL 長期用 302 指向另一個 URL,蜘蛛會持續認為原地址仍是正式地址,信号合並和 URL 規范化都會變慢。換域名、改目錄這類不可逆的調整,用 301 更合适。
Sitemap 和内鏈里不要放跳轉 URL
Sitemap 是给蜘蛛的 URL 清單,里面出現 301 或 302 的地址,等于让它先去跳一次再回来。正确做法是清單里只寫最终可訪問、返回 200 的地址。内鏈同理:導航、面包屑、正文里的連結直接指向最终 URL,能省掉大量無意义的跳轉請求。
至于 JS 跳轉和 meta refresh,蜘蛛的處理能力弱于服務端 301、302,延迟更高,甚至可能不执行。需要長期生效的跳轉,優先放在服務端完成。
跳轉鏈怎么自查
- 随机抽取站内 20 到 30 個入口 URL,记錄跳數,把超過一跳的整理出来。
- 检查协议、主机名、尾斜杠這三類規則能否合並成一條。
- 統計日誌中 3xx 請求涉及的 URL 數量,看是否集中在少數几條鏈上。
- 確認所有跳轉鏈的终点都返回 200,並且没有被 robots.txt 或 meta 标簽挡住。
把跳轉控制在一次以内,终点稳定返回 200,URL 的發現路径就會短很多。這件事不需要复杂工具,在配置层做一次整理,效果通常比反复提交 Sitemap 更直接。