蜘蛛訪問一個 URL 时,最先拿到的是 HTTP 响應。狀態碼决定接下来怎么處理,响應头則像一组附加說明,告诉蜘蛛這個 URL 的類型、能否索引、是否有替代版本、多久之後可以再来。很多抓取問题不在正文里,而在這些容易被忽略的头部字段中。
响應头為什么會影响 URL 發現
蜘蛛解析 HTML 連結的前提,是它把响應内容当作 HTML 處理。如果 Content-Type 寫成 text/plain 或 application/octet-stream,蜘蛛可能只儲存文本,不去提取其中的 a 标簽。结果就是頁面能被抓取,但里面的連結不會進入待抓取队列,URL 發現路径在這里断掉。
另一個常见情况是响應头里带了 noindex 或 nofollow,而站点管理員只检查了 HTML meta 标簽。X-Robots-Tag 的優先級不低,尤其是由服務器、CDN 或 WAF 统一添加时,很容易影响到整站或某個目錄。
三個常被寫错的响應头
Content-Type
HTML 頁面應返回 text/html,並带字符集,例如 text/html; charset=utf-8。如果後端框架、反向代理或 CDN 把類型改成了 text/plain,蜘蛛仍可能抓取,但對連結的解析會變得不可靠。動態渲染服務、下载接口和 API 路由尤其容易出這個問题。
X-Robots-Tag
這個头部可以按 URL 路径批量控制抓取和索引。比如给測試目錄加 noindex,给图片加 noindex 但保留抓取,都是常见用法。問题在于:一旦規則寫宽了,或者某個中間层預設加上了 noindex,蜘蛛會按头部执行,頁面即使有正常内鏈也可能不被索引。排查时先看响應头,再看 HTML meta,顺序不要反。
Link
Link 头可以传递 rel=canonical、rel=alternate、rel=next/prev 等關系。蜘蛛會把它当作頁面關系的一部分。如果 Link 头里的 canonical 指向了错誤 URL,或者和 HTML 里的 canonical 不一致,蜘蛛需要自己判断,抓取路径可能被带偏。多語言站点的 hreflang 如果只寫在 Link 头里,也要保證語言代碼和 URL 對應正确。
Retry-After 與抓取退让
当服務器返回 503 或 429 时,可以在 Retry-After 里寫明多少秒後重试,或给一個具体時間。蜘蛛會參考這個信号調整再次訪問的間隔。寫得太短,服務器還没恢复,蜘蛛可能繼續撞墙;寫得太長,URL 复查會被推迟。對于計划内维護,比直接返回 200 的空頁面更清楚。
响應头是蜘蛛判断“這個 URL 現在能不能抓、抓了怎么用”的快捷依據。它不决定排名,但會影响 URL 是否被發現、是否進入索引流程。
站点侧怎么检查
- 用 curl -I 或浏览器開發者工具查看目标 URL 的响應头,確認狀態碼和 Content-Type。
- 搜尋 X-Robots-Tag,確認没有意外的 noindex、nofollow 或 nosnippet。
- 核對 Link 头里的 canonical、alternate 是否與頁面内声明一致。
- 检查 CDN、WAF、反向代理是否批量添加了头部規則,尤其是新上线的安全策略。
- 在抓取日誌中观察同一 URL 的返回狀態,若大量 503 或 429,结合 Retry-After 判断退让节奏。
响應头本身不复杂,难的是它经常由多個层共同寫入。上线新功能、更換 CDN 或調整安全規則後,抽几個代表性 URL 看一眼头部,比事後從日誌里反查要省事。把 Content-Type、X-Robots-Tag、Link 和 Retry-After 這几項纳入例行检查,蜘蛛的 URL 發現和抓取路径會更可控。