站点改版、換域名、調整栏目结构,都會留下舊地址。為了让訪問者和蜘蛛都能走到新頁面,通常要配置重定向。但重定向不是配置完就結束,跳轉鏈路的長短、狀態碼的選擇、落点是否可抓取,都會直接影响蜘蛛能不能顺利完成這一轮抓取。
蜘蛛遇到 3xx 之後做了什么
当蜘蛛請求一個 URL 拿到 3xx 响應时,它不會立刻放弃,而是讀取响應头里的 Location 目标地址,再發起一次新的請求。這次請求和第一次一样,要重新经過解析域名、建立连接、等待响應等环节。也就是说,跳轉不是零成本的,它相当于让蜘蛛多抓了一個頁面,只不過這個頁面没有内容。
拿到最终頁面的 200 响應之後,蜘蛛才開始解析正文和連結。如果同一批 URL 都带着跳轉,抓取预算就會被大量消耗在中轉环节,真正的内容頁面反而抓得更少。
鏈式跳轉:每一跳都要重新排队
比單次跳轉更麻烦的是鏈式跳轉。常见的情况是 http 跳到 https,https 的裸域再跳到 www,www 又跳到带語言目錄的地址,一條鏈走完要三到四次。對這種地址,蜘蛛通常不會無限跟下去,跳轉次數過多时可能中途停止,最终頁面就進不了抓取范围。
即便蜘蛛一路跟到底,中間每一跳的地址也會被记錄,日誌里出現大量 301,看上去抓取很活跃,實际覆盖到的獨立頁面並不多。
301 和 302 不能用混
301 表示永久迁移,蜘蛛會逐步把舊地址替換成新地址,把已经积累的信号轉移到目标頁。302、307 表示临时跳轉,蜘蛛通常保留舊地址繼續观察,不做替換。如果長期用 302 承担永久迁移的职责,舊地址會一直留在抓取队列里,新地址也得不到稳定確認。
還要留意 302 的落点。有的站点把無结果頁跳到列表頁,或者把需要登入的地址跳到首頁,這類跳轉一旦被大量内鏈指向,蜘蛛就會反复跟到同一個頁面,形成無效抓取。
几種容易把蜘蛛带偏的跳轉
- 循环跳轉:A 跳到 B,B 又跳回 A。蜘蛛跟几次後會放弃,两個地址都难以被正常處理。
- 超長鏈條:轉手四五次以上,中途被放弃的概率明顯上升。
- 跳到不可抓取的地址:跳轉目标被 robots.txt 拦截,或本身返回 404、410,等于白走一趟。
- 跨协议跨域叠加:http 到 https、裸域到 www、主域到子域同时存在,鏈路被越拉越長。
- 落点频繁變化:目标地址不稳定,蜘蛛每次跟到的结果都不一样,很难判断哪個是正式地址。
内鏈和 Sitemap 该指向哪一版
做重定向的同时,站内剩下的連結要同步更新。理想狀態是站内連結直接指向最终地址,让蜘蛛一步到位;重定向只留给外部連結、歷史收藏和已经進入索引的舊地址。如果内鏈還大量指向跳轉地址,等于人為把抓取路径拉長。
Sitemap 里同样只放最终地址。把跳轉地址寫進 Sitemap,會让抓取队列里混入一批永遠返回 3xx 的 URL,白白占用額度。同时要確認 Sitemap、内鏈、canonical 指向的是同一個版本,避免给出互相矛盾的信号。
自查重定向鏈的顺序
- 從日誌里筛出狀態碼為 3xx 的請求,按 URL 匯總,看哪些地址被反复抓取。
- 對這些地址用命令行工具或抓取工具完整跟一遍,记錄跳轉次數和最终狀態碼。
- 重点检查落点:是否返回 200、是否被 robots.txt 允许、是否是伪装成正常頁面的软 404。
- 检查内鏈和 Sitemap,把指向跳轉地址的連結替換成最终地址。
- 確認狀態碼選擇正确:永久迁移用 301,真正临时的场景才保留 302。
重定向是過渡手段,不是長期方案。鏈路越短、落点越稳定,蜘蛛把時間花在内容上的比例就越高。