站点換域名、調整目錄层級、合並栏目之後,重定向几乎是必然會出現的中間产物。大多數运营者關注的是用戶還能不能正常打開頁面,而蜘蛛這一侧要面對的是另一個成本:每跳一次,就要多花一次請求机會。
蜘蛛拿到 3xx 之後會怎么處理
蜘蛛請求一個地址,如果服務器返回 301 或 302,它會讀取响應头里的 Location,然後對這個新地址再發起一次請求。這個新地址同样要走完整的抓取流程:解析域名、建立连接、等待首字节、下载並解析正文。也就是说,一次跳轉在蜘蛛那邊並不是轻量操作,它是實打實的又一次抓取。
301 與 302 的区別
- 301 表示永久迁移。蜘蛛通常會逐步把索引里的舊地址替換成新地址,内鏈和外鏈的價值也倾向于顺着新地址延續。
- 302 表示临时跳轉。蜘蛛一般會保留原地址,並繼續回来检查這個临时狀態是否還在。
- 把長期有效的迁移寫成 302,容易出現新舊两個地址長期並存的情况,判断上的模糊就来自這里。
308 與前端跳轉
308 與 301 類似,但明确要求保持請求方法,可以理解為更嚴格版本的永久跳轉,在需要保留 POST 等請求方式的场景下更合适。另外還有一類容易被忽略的:meta refresh 和 JavaScript 跳轉。它們不在 HTTP 头里,蜘蛛必须先把頁面 HTML 下载並解析完,才知道要去哪里,成本比头部跳轉更高,而且解析环节一旦出問题,這條路径就断在這里。
一次跳不到位,成本會被放大
A 跳到 B,B 又跳到 C,這種鏈式重定向在歷史积累較久的站点里很常见。對蜘蛛来说,一次跳轉是两次請求,两次跳轉就是三次請求,而最终落地的内容只有一份。抓取预算是有限的,這些被中間环节吃掉的請求不會产生任何新内容,還會挤占本来可以分给正常頁面的份額。
更麻烦的是鏈條中途出問题。比如 A 通過 301 指向 B,而 B 返回了 404 或者 5xx,蜘蛛走到的就是死路。還有一種情况是跳轉回自身,或者 A 到 B、B 又回到 A,形成循环。蜘蛛遇到循环會停止跟随,但已经被消耗掉的抓取次數收不回来。
另外,如果内鏈和 Sitemap 里仍然寫着最初的舊地址,那么蜘蛛每一次從站内走到這個連結,都會重复经歷整條跳轉鏈。連結入口越多,這種重复就越明顯。
怎样查清站内的重定向情况
- 用 curl -I 或類似的头部检查方式,逐個確認關键地址返回的狀態碼以及 Location 指向哪里。
- 翻服務器日誌,筛出狀態碼為 3xx 的請求,重点看哪些地址被反复請求、鏈條有多長。
- 检查 Sitemap 文件,確認里面寫的是最终地址,而不是還需要跳轉的舊地址。
- 抽几個主要频道頁,確認内鏈與導航指向的是终点,而不是中轉地址。
可以做的几項調整
- 把多次跳轉压缩成一次,让舊地址直接指向最终頁面。
- 長期迁移用 301,临时活動用 302,尽量避免長期混用。
- 内鏈、導航、Sitemap 统一更新為最终地址,减少蜘蛛從站内進入跳轉鏈的机會。
- 定期清理已经失效的中轉地址,避免它指向的终点早已下线却没人發現。
重定向是迁移過程中的過渡手段,不是長期结构。鏈條越短,蜘蛛越省事,頁面被發現和被检查的机會也越稳定。