很多人做入口頁时,懒得寫可点击的連結,直接放一段 meta refresh 或者 location.href 跳轉。這样确實省事,但對搜尋蜘蛛来说,“能不能跟過去”和“跟過去之後算不算發現新 URL”,是完全不同的两件事。
先说结论
结论分三档:服務端 301/302 最稳,meta refresh 次之,纯 JS 跳轉最不稳定。三者都有可能被抓到,但可控程度差別很大。
meta refresh 搜尋蜘蛛怎么處理
meta refresh 寫在 head 里,属于 HTML 源碼的一部分。蜘蛛抓取入口頁时不需要执行 JS 就能讀到這段内容,所以理论上它會解析並跟進目标 URL。這也是它比 JS 跳轉更保險的原因。
但有两点容易被忽略:
- 延迟時間。寫成 0 秒或 1 秒,被当成跳轉對待的可能性較大;寫成 30 秒甚至更長,很多實現會把它当成“内容稍後更新”的信号,不一定按跳轉處理。
- 不能有干扰。head 里如果同时存在 meta refresh、canonical、noindex,几個信号會互相打架,最终按哪個执行不好预测。
JS 跳轉為什么要打折扣
location.href、window.open、前端路由里的 push,都要等浏览器执行脚本之後才产生跳轉。搜尋蜘蛛是否执行 JS,取决于它用的渲染服務、脚本和资源是否被 robots.txt 屏蔽、頁面是否在渲染队列里超时。
實际表現经常是:入口頁日誌里有蜘蛛訪問,目标站日誌里却没有對應记錄。這不代表蜘蛛“不認”JS,而是這一次没走完渲染流程。
判断方法很简單:對一下两邊的日誌時間戳。入口頁有訪問,几秒内目标站也出現相同 UA 的訪問,說明跳轉鏈路是通的;如果只有前者,基本就是渲染這一關没過。
想让跳轉更可靠,可以這样做
- 優先用服務端跳轉。入口頁只輸出 301 或 302,Location 指向目标 URL,不依赖任何客戶端执行。
- 必须用 meta refresh 时,延迟设為 0,head 里不要塞別的互相冲突的指令。
- 同时保留一個可点击的 a 标簽。哪怕用戶视觉上看不到,源碼里存在連結,等于多给蜘蛛留了一條路径。
- 別把跳轉寫在 body 里靠後的 script 中,越靠後越容易被截断。
跳轉之後,入口頁要不要留内容
如果入口頁除了跳轉代碼什么都没有,它就是一個纯空壳。空壳本身不是违規,但入口頁數量大、内容高度雷同、只承担導流作用时,整站质量會被压低,蜘蛛的到訪频率也可能跟着下降。建议至少保留一段和目标主题相關的獨立文字,让這個頁面有存在的理由。
几個常见誤区
“跳轉成功就等于被發現”。跳轉只是让蜘蛛到達目标 URL,是否抓取、是否收錄,還要看目标站本身的可訪問性、内容质量和 robots 設定。
“多加几层跳轉更安全”。恰恰相反,鏈條越長,中間任何一环失敗都會断掉,入口頁直接指向目标 URL 最好。
“用了跳轉,蜘蛛就一定會频繁来訪”。抓取频率由站点整体信誉和服務器响應决定,跳轉只是其中一個小环节。
怎么驗證
- 用不执行 JS 的抓取方式請求入口頁,看返回内容里有没有完整的目标 URL。
- 對比入口頁和目标站的訪問日誌,看 UA、時間、次數能否對上。
- 连續观察几天,如果目标站的蜘蛛訪問始终為 0,先把跳轉換成服務端跳轉,再排查其他环节。
總结一下:跳轉方式决定了蜘蛛“看到”目标 URL 的概率,而目标 URL 最终能不能被抓、被收錄,是另一套獨立的判断。把跳轉這一段做扎實,只是把前面的路铺平,後面的结果仍要看目标頁面自己。