搜尋抓取

重定向鏈與 URL 發現:301、302 之後蜘蛛會跟着走多遠

服務器返回的 3xx 响應本身就是一條 URL 發現路径。本文梳理 301、302、meta refresh 和 JS 跳轉在蜘蛛眼里的差別,說明跳轉鏈為什么會拖慢新地址的發現速度,以及内鏈、Sitemap 和跳轉規則應该怎么配合,减少不必要的抓取消耗。

搜尋抓取

重定向鏈與 URL 發現:301、302 之後蜘蛛會跟着走多遠

重定向也是一種 URL 發現方式

很多人把 URL 發現理解成「内鏈 + Sitemap + 外鏈」,其實服務器返回的 3xx 响應同样是蜘蛛拿到新地址的途径之一。当蜘蛛請求 A 地址,服務器回一個 301 並带上 Location 头,蜘蛛就會把 B 地址放進待抓队列。換句话说,一次跳轉相当于一次額外的 URL 提交。

這個過程是有成本的:蜘蛛花在 A 上的那次請求没有拿到内容,還得再花一次請求去 B。跳轉鏈越長,浪費的抓取预算越多,最终頁被首次抓取的時間也越靠後。

几種跳轉方式,蜘蛛的處理並不一样

  • 301 / 308:表示永久迁移,蜘蛛通常會逐步把索引里的地址換成目标地址,已有内鏈也會被重新指向。
  • 302 / 307:临时跳轉,蜘蛛一般會繼續保留原地址並反复訪問,同时也會抓取目标地址,相当于两個 URL 都需要维護。
  • meta refresh:寫在 HTML 里的跳轉,蜘蛛需要先拿到頁面並解析,優先級低于 HTTP 头,延迟通常更長。
  • JavaScript 跳轉:依赖渲染能力,能不能被跟上不确定性最大。

跳轉鏈:每一步都在拖慢發現速度

比較麻烦的是鏈式跳轉。协议從 http 到 https、域名带 www 到不带 www、舊域名到新域名、舊栏目到新栏目,几條規則叠加起来,一個地址可能要跳三四次才落到最终頁。對蜘蛛来说,每多一跳就多一次請求,落地頁的抓取時間被推後,抓取频次也可能受到影响。

還有一種情况是循环跳轉,A 跳 B、B 跳回 A。蜘蛛一般在尝试若干次後會放弃,把它当作抓取異常處理,對應的 URL 很难被正常收錄。

另外,Location 头建议寫成绝對地址。相對地址虽然規范允许,但解析依赖目前路径,規則寫错就容易跳到意想不到的位置,排查时也更費劲。

跳轉放在哪一层,响應速度不一样

301 可以寫在 Web 服務器配置里,也可以在應用代碼里判断後輸出。前者几乎不经過业務逻辑,响應更快;後者要走一遍程序初始化,首字节時間會明顯變長。蜘蛛對首字节時間是有耐心上限的,長期偏慢會拉低整個站点的抓取节奏。能放在服務器层的規范化跳轉,就別留给應用层。

内鏈尽量直接指向最终地址

改版之後只做跳轉、站内連結却還停在舊地址,是常见的偷懒做法。结果就是每一次用戶点击和蜘蛛爬取都要经過一次跳轉。更省事的方式是:跳轉規則留给外鏈和歷史流量,站内導航、正文、面包屑、Sitemap 里的連結统一替換成最终地址。

同样,Sitemap 里只放最终 URL,不要放會跳轉的中間地址。既有 301 又有 Sitemap 提交,等于让蜘蛛用两條路径去同一個地方,多花一份预算。

排查时可以看這几個地方

  1. 抓取日誌里 3xx 的占比。占比長期偏高,說明站内還有大量連結指向跳轉地址。
  2. 跳轉鏈長度。用命令行工具跟随 Location,看一個 URL 到底跳了几次。
  3. 协议、域名、路径大小寫、结尾斜杠這几類規范化跳轉是否重复叠加。
  4. 頁面内的 meta refresh 與 JS 跳轉,能否用服務端 301 替代。
跳轉是补救手段,不是長期结构。能一次性把最终地址给到蜘蛛,就別让它多走一站。