蜘蛛發現一個連結後,並不會只看一眼就結束。它會先請求這個 URL,如果服務器返回 3xx,它還會繼續跟到 Location 指向的新地址。這個過程就是重定向在 URL 發現里的作用:連結指向 A,A 跳到 B,B 再跳到 C,蜘蛛最终才拿到頁面内容。問题在于,每一次跳轉都要占用一次請求和一点時間,跳數多了,蜘蛛跟進的速度和意愿都會受影响。
蜘蛛是怎么處理重定向的
常见的重定向狀態碼有 301、302、307、308。301 和 308 通常表示永久搬移,302 和 307 表示临时搬移。對蜘蛛来说,這两種信号含义不同:如果是永久搬移,它更可能把權重和索引慢慢轉移到新地址;如果是临时搬移,它會更倾向于保留原地址。但無论哪種,蜘蛛都需要先跟過去,才能確認最终頁面是否值得繼續抓取。
如果重定向鏈只有一跳,比如 HTTP 跳到 HTTPS,或者不带 www 跳到带 www,蜘蛛的消耗很小。但如果是多跳串联,比如先跳 HTTPS,再跳 www,再跳结尾斜杠,再跳大小寫,最後才到目标頁,那這段鏈路就會拖慢 URL 發現。
跳數多了會带来什么影响
- 抓取资源被中間地址消耗:每一次跳轉都是一次 HTTP 請求,蜘蛛在到達最终頁面前已经花掉了時間。
- URL 進入队列的顺序被推後:最终頁面的抓取優先級可能下降,新内容被發現得更慢。
- 鏈路一長,出错概率變高:中間任何一跳返回 404、503 或循环,蜘蛛都可能放弃。
- URL 規范容易混乱:日誌里同时出現 A、B、C 多個地址,你很难判断到底哪一個才是蜘蛛最终認可的目标。
對蜘蛛池或站群入口来说,這個問题更明顯。入口頁本来承担的是把蜘蛛引向目标頁的任務,如果入口連結還要经過好几跳才到目标,發現效率就會打折扣。
常见的重定向鏈场景
很多站点的重定向不是故意设計成鏈的,而是配置一层层叠加出来的。比較典型的有:
- HTTP 先跳 HTTPS,HTTPS 再跳带 www,带 www 再跳到去斜杠版本。
- 舊域名跳新域名,新域名又跳主站,主站再跳栏目頁。
- 移動端判断跳轉:桌面 URL 先跳移動 URL,移動 URL 又因為參數問题跳回桌面 URL。
- CDN 邊缘节点回源时再做一次跳轉,用戶和蜘蛛看到的跳轉次數不一致。
這些鏈路平时不一定會出問题,但在蜘蛛集中抓取或服務器负载較高时,多一跳就多一次超时風險。
怎么检查和收敛重定向
如果你不确定站内是否存在長跳轉鏈,可以按下面的顺序排查:
- 看抓取日誌:筛出返回 3xx 的 URL,观察 Location 指向哪里,是否连續出現多次 3xx。
- 用命令行检查:curl -I 或 curl -IL 可以逐跳查看响應头和最终地址,注意记錄跳數。
- 更新内鏈:把站内連結直接寫成最终 URL,不要依赖重定向去纠正。
- Sitemap 只放最终 URL:Sitemap 里如果放了跳轉地址,蜘蛛還要多走一步,不如直接提交终点。
- 服務器和 CDN 配置收敛:把 HTTP 到 HTTPS、域名统一、结尾斜杠規則合並成一次跳轉。
一個實用的原則是:從任意入口到最终頁面,重定向最好不超過两跳。超過两跳的鏈路,值得優先處理。
几個容易忽略的细节
- 避免循环重定向:A 跳 B,B 跳 A,蜘蛛會很快放弃,而且會浪費抓取资源。
- 302 不要長期使用:临时跳轉放久了,蜘蛛和用戶都容易困惑,该用 301 就用 301。
- 參數跳轉要谨慎:用參數判断设备或語言时,确保不會把同一個 URL 反复跳来跳去。
- HSTS 和 CDN 缓存:開啟 HSTS 後,HTTP 跳 HTTPS 的行為可能被浏览器记住,但蜘蛛端仍以實际响應為准,別假设它一定不請求 HTTP。
- 跳轉目标要稳定:最终 URL 如果也经常變動,蜘蛛每次来都要重新走一遍鏈路,URL 發現會更慢。
把最终地址直接交出去
重定向本身不是坏事,它是站点迁移和規范化时的必要工具。但重定向鏈越長,蜘蛛發現最终 URL 的成本就越高。更稳妥的做法是:内鏈、Sitemap、主動推送和入口頁都尽量使用最终 URL,把重定向留给确實需要兼容的舊地址。這样蜘蛛每次来訪都能少走几步,URL 發現也會更顺。