蜘蛛池入口頁常见的做法有两種:一種是放一堆連結让蜘蛛顺着爬,另一種是直接跳轉到目标URL。後者看起来更省事,但跳轉方式不同,搜尋蜘蛛的處理结果差別不小。有人用 301,有人用 302,有人图省事挂一段 JS 或 meta refresh,最後發現入口頁有訪問、目标URL却毫無動静。這篇把几種跳轉方式拆開讲清楚。
搜尋蜘蛛對跳轉的基本處理逻辑
蜘蛛拿到入口頁的响應後,會先看 HTTP 狀態碼,再决定要不要跟到新地址。大致規律如下:
- 301 永久跳轉:會被当作地址永久變更處理,抓取和信号一般會跟着迁到新地址,最终以目标URL為落点。用于 URL 發現,這是最干净的一種。
- 302 / 307 临时跳轉:被理解為“暂时換個地方”,原地址仍可能保留在索引里,目标URL能不能被發現和抓取,更多取决于它自己能否獨立訪問。307 與 302 在處理上接近,只是對請求方法的限制更嚴格。
- meta refresh:属于頁面内声明,蜘蛛要先解析 HTML 才能看到。0 秒刷新和 3 秒刷新的處理並不相同,延迟刷新可能被忽略。
- JS 跳轉(如 location.href):必须進入渲染阶段才會执行。蜘蛛不一定會渲染,或者在渲染队列里排很久,URL 發現的时效性最差。
跳轉鏈長度才是被忽略的主因
比跳轉方式更容易出問题的是鏈路太長。入口頁 302 到中間頁,中間頁再 meta refresh 到另一個域名,最後 301 落到目标URL——三段以上的鏈路,蜘蛛经常在中途就停了。合理的做法是:一個入口頁只做一次跳轉,直接落到最终地址,且最终地址返回 200。
還有几種情况會让跟進直接断掉:跳轉目标返回 404 或 410、跳轉形成环(A→B→A)、跳轉目标需要登入或彈驗證頁、跳轉目标自身又 302 到別處。這些在日誌里通常表現為“入口頁有訪問,目标URL一條记錄都没有”,排查时先看鏈路本身,而不是繼續加連結。
做 URL 發現时的具体建议
- 入口頁跳轉统一用 301,只跳一次,直接指向最终可訪問的 URL。
- 不要在 301 之後再叠一层 JS 跳轉,双重跳轉只會增加丢失概率。
- meta refresh 尽量不用;非用不可时把刷新時間设為 0 秒,並確認跳轉目标返回 200。
- 跳轉目标與入口頁的可訪問性保持一致:入口頁能抓,目标頁也要能抓,不要出現一個能抓、一個被 WAF 拦的情况。
- 批量測試前先確認目标URL不是長期停在“已發現”狀態的頁面,避免把抓取预算耗在低優先頁面上。
怎么驗證跳轉有没有被真的跟進
只看入口頁日誌是不够的,那只能說明蜘蛛来過了。至少要看三個地方:
- 入口頁响應碼日誌:確認返回的是 301 還是 302,中間有没有夹着 5xx。
- 目标URL訪問日誌:看時間戳是否紧跟入口頁之後几秒到几分钟内,UA 是否與入口頁一致。
- 命令行复核:用 curl -I 或带 -L 的請求查看完整跳轉鏈,確認每一跳的狀態碼和最终落点。
如果入口頁有訪問、目标URL完全没有记錄,優先怀疑跳轉鏈、目标URL的狀態碼,以及目标URL所在服務器的防護策略這三處。
几個常见誤区
跳轉只是把地址告诉蜘蛛的一種方式,它不保證目标URL一定被收錄。發現、抓取、收錄是三件事,不能混為一谈。
- 以為 302 也能传递全部信号:實际處理通常更保守,做長期發現用途不如 301 稳。
- 以為 JS 跳轉和 301 等效:渲染與否、渲染时机都不确定,时效性差很多。
- 以為跳轉路径越多覆盖面越广:鏈路越長,中途断掉的概率越高。
把跳轉做简單,让入口頁到目标URL只有一跳,是這類入口頁最容易落地、也最容易被忽略的一條。