站点运营

站点运营:HTTP 响應头自查,別让蜘蛛收到矛盾的信号

响應头是蜘蛛訪問頁面时看到的第一份信息。本文梳理 Content-Type、X-Robots-Tag、Last-Modified、ETag、Vary、Retry-After 與 Link 头這几個常见字段,說明它們各自影响什么,並给出一份可执行的抽查清單,帮助运营者尽早發現配置上的矛盾信号。

站点运营

站点运营:HTTP 响應头自查,別让蜘蛛收到矛盾的信号

很多站点把注意力放在正文和連結上,却忽略了服務器返回的那几行响應头。蜘蛛拿到的第一份信息就是响應头:内容是什么類型、能不能索引、有没有更新、要不要稍後再来。這些字段一旦寫错或前後矛盾,蜘蛛的判断就會跟着偏。

Content-Type 與字符集:先说清楚這是什么

最基础的一條是 Content-Type。它告诉蜘蛛這是一個 HTML 頁面、一張图片還是一份文件。如果 CMS 或服務器把 HTML 頁面返回成 text/plain,蜘蛛看到的就可能是一堆源碼文本,正文解析容易出問题。

字符集同样重要。中文站点如果声明與實际编碼不一致,頁面會出現乱碼,标题和正文的识別都會受影响。建议在响應头里明确 charset=utf-8,並與頁面内的 meta 声明保持一致,不要一處寫 utf-8、另一處寫 gb2312。

X-Robots-Tag:看不见的 meta robots

meta robots 寫在 HTML 里,而 X-Robots-Tag 寫在响應头里,作用相同,優先級更高。常见用法是给某個目錄下的 PDF、图片统一加 noindex,避免它們進入索引。

風險也在這里:這個字段常常由运维或安全策略顺手加上,运营同学並不知情。一旦全站响應头里带了 noindex,頁面看起来正常,索引却會慢慢清空。排查抓取異常时,建议用命令行工具看一眼响應头,確認没有意外的 X-Robots-Tag。

Last-Modified 與 ETag:让蜘蛛知道頁面有没有變

這两個字段支持條件請求。蜘蛛再次訪問时带上 If-Modified-Since 或 If-None-Match,服務器如果發現内容没變就返回 304,既省带宽,也让蜘蛛把抓取预算留给別的頁面。

需要注意的是別让它們乱跳。有些站点每次請求都重新生成 ETag,或者把 Last-Modified 设成目前時間,蜘蛛每次都被判定為有新内容,于是反复抓取同一個頁面。稳定、真實的更新時間更有價值。

Vary 與内容协商:同一個 URL 给出几套内容

如果服務器根據 User-Agent 或 Cookie 返回不同版本,比如给移動端返回简化版、给未登入用戶返回另一套模板,需要通過 Vary 說明依據。否則缓存和蜘蛛都可能拿到不符合预期的版本。這類差异化最好控制在必要范围内,主体内容尽量保持一致。

限流與 Retry-After:礼貌地告诉蜘蛛慢一点

当服務器压力大时,返回 429 或 503 並附带 Retry-After,比直接超时更友好,蜘蛛會按提示稍後再来。相反,如果長期用 403 或 429 打發所有請求,抓取量下降是自然结果。

另外,返回 503 时不要同时带上 noindex,短暂的维護不该被理解成永久下线。

Link 头:另一種传递 canonical 的方式

對非 HTML 文件,比如 PDF,頁面里没法寫 canonical,可以用 Link 响應头指向規范版本。如果响應头里的規范地址和 HTML 里的 canonical 指向不同位置,蜘蛛就會收到矛盾信号,至少要让两者保持一致。

一份可执行的自查清單

  • 抽查首頁、栏目頁、詳情頁的响應头,確認 Content-Type 為 text/html 且字符集正确。
  • 全站搜尋 X-Robots-Tag,排除被批量加上 noindex、nofollow 的情况。
  • 检查 Last-Modified 與 ETag 是否稳定,是否支持返回 304。
  • 確認 Vary 設定與實际的差异化返回逻辑匹配。
  • 维護期間返回 503 加 Retry-After,而不是 200 或 403。
  • canonical 的响應头寫法與 HTML 寫法保持一致。
响應头是蜘蛛看到的第一句话。與其事後從日誌里猜它為什么不来,不如先把這句话说清楚。

這些字段平时不會出現在後台界面里,改動也常常是顺手為之,所以更需要定期抽查。把响應头纳入站点运营的日常检查項,抓取上的很多“莫名其妙”,其實都能在這里找到解释。