在蜘蛛池里,跳轉是连接入口頁和目标頁最常用的手段之一:入口頁本身内容單薄,靠跳轉把蜘蛛引向真正想被看到的頁面。但跳轉不是只有“跳過去”一個结果,301、302、307、JS 跳轉和 meta refresh 在蜘蛛眼里是几種不同的信号,用错會让路径断掉,或者把抓取消耗在路上。
301:明确告诉蜘蛛“這里已经搬到新地址”
301 表示永久迁移。蜘蛛抓到 301 後,通常會顺着 Location 头訪問新地址,並在後續把舊地址逐步替換成新地址,連結信号也會向新地址集中。對蜘蛛池来说,這适合两種场景:入口頁整体換域名或換目錄;某個入口頁失效後,想让它繼續發挥作用。
要注意的是,301 的目标不要频繁更換。今天指向 A、下周指向 B,蜘蛛每次回来都看到不同落点,對這個入口頁的判断就會變得不稳定。
302 與 307:临时指向,蜘蛛會反复確認
302 表示临时跳轉。蜘蛛一般不會立刻把舊地址從索引里删掉,而是繼續保留观察,同时訪問目标頁。短期内這是安全的,但如果一個入口頁長期只返回 302,蜘蛛可能仍按临时處理,也可能逐渐按目标頁的内容来理解頁面,结果不太可控。
307 與 302 類似,但明确保留原有的請求方法。對于蜘蛛抓取這種 GET 請求来说,两者的差別很小,選哪個主要看服務器配置和维護习惯。
JS 跳轉與 meta refresh:依赖渲染,确定性更差
用 JavaScript 做跳轉时,蜘蛛必须执行脚本才能看到目标地址。抓取能力有限的蜘蛛可能只拿到一個几乎空白的 HTML 就离開;能渲染的蜘蛛則要額外消耗渲染资源。相比之下,meta refresh 寫在 HTML 头部就能被讀到,比 JS 跳轉更容易被發現,但延迟時間不宜设得太長,0 到 1 秒比較直接。
這两種方式的共同問题是:連結關系本身没有被明确表達。蜘蛛未必會把目标頁当作原地址的繼承者,更多只是“顺路看了一眼”。
比選哪種更麻烦的,是跳轉本身出了問题
- 跳轉鏈太長:A→B→C→D,每多一跳就多一次抓取消耗,蜘蛛可能中途放弃。
- 跳轉成环:两個入口頁互指,蜘蛛来回打轉,抓取配額被白白消耗。
- 跳到 404 或 5xx:跳轉生效但落点不可訪問,等于把蜘蛛送到死路。
- 與 canonical 冲突:頁面 301 到 B,canonical 却寫着 C,信号互相打架。
- 跳轉到不可控的第三方域名:落点一旦變化,入口頁的價值也跟着失控。
按目的選跳轉方式
- 入口頁永久迁移、目錄調整:用 301,把跳轉鏈控制在一跳以内。
- 临时活動、A/B 測試、過渡期:用 302,並设好結束時間,別長期挂着。
- 需要保留請求方法或對接特定服務:用 307。
- 静態頁面、不方便改服務器配置:可以用 meta refresh,但不要用 JS 拼接跳轉地址。
- 只是想做流量分發、不希望影响蜘蛛對地址的判断:優先考虑用 a 标簽連結跳轉,而不是服務端跳轉。
上线後的自查清單
- 用不执行 JS 的工具抓一次,確認返回的是不是 3xx,Location 是否正确。
- 確認從入口頁到最终頁面只有一跳,没有中間环节。
- 检查最终頁面狀態碼是 200,且内容與入口頁主题不脱节。
- 確認跳轉目标與 canonical、sitemap 中寫的地址一致。
- 记錄每次調整跳轉的時間和原因,方便日後回溯。
跳轉是给蜘蛛指路,不是替蜘蛛做决定。地址稳定、落点可訪問、信号一致,比纠结選 301 還是 302 更重要。