站点运营

站点运营:响應头與 X-Robots-Tag 自查,別让頁面被誤标為不索引

頁面内容没問题,抓取却不顺,問题常藏在 HTTP 响應头里。本文梳理 X-Robots-Tag、Content-Type、Last-Modified、ETag、Vary 等头部的作用與常见誤配,並给出一份可直接执行的自查清單,帮助你確認服務器對每條 URL 的說明與预期一致。

站点运营

站点运营:响應头與 X-Robots-Tag 自查,別让頁面被誤标為不索引

頁面内容本身没問题,抓取却總是不顺,問题有时出在看不见的地方——HTTP 响應头。响應头是服務器给爬虫和浏览器的第一层說明,狀態碼只是其中一行,字符集、缓存校驗、抓取指令同样寫在這里。它不占頁面体积,却直接影响抓取方如何理解一條 URL。下面按几類常见头部逐項梳理。

一、X-Robots-Tag:最容易誤伤的抓取指令

X-Robots-Tag 的作用和頁面里的 meta robots 類似,但寫在响應头中,對图片、PDF、JS 等無法寫 meta 的资源尤其有用。風險也在這里:它作用范围往往由服務器或 CDN 配置统一决定,一旦寫错,影响的是整批 URL 而不是單個頁面。

  • 只想着屏蔽測試环境或後台目錄,規則却匹配到了正式栏目;
  • 临时加了 noindex 做排查,事後忘记移除;
  • CDN、反向代理或安全防護层附加了指令,源站配置里看不到;
  • 對整站统一加了 noindex,只在少數路径上做了例外。

建议把站内所有 X-Robots-Tag 配置集中记錄一份,注明添加時間、适用范围和负责人。對重要栏目頁、内容頁,抽查確認头部里没有 noindex、none 之類的指令。

二、Content-Type 與字符集

Content-Type 應完整包含類型與字符集,例如 text/html; charset=utf-8。如果只寫 text/html 而頁面又依赖 meta 声明编碼,解析环节多一层判断,遇到编碼不一致时容易出現乱碼,影响正文识別。常见的坑是把 sitemap.xml、robots.txt 返回成 text/html,或把 JSON 接口返回成 text/plain,虽然未必立刻出错,但會增加解析歧义。

三、Last-Modified 與 ETag

這两個头部用于判断资源是否發生變化。Last-Modified 缺失时,抓取方难以知道頁面何时更新;時間被统一寫成服務器目前時間,則每次訪問都像刚改過,反而失去參考價值。ETag 如果由多台机器各自生成,同一頁面可能返回不同的值,容易出現無意义的重复拉取。内容更新後,這两個值應当跟着變化;内容没變,則保持一致。

四、Vary 與缓存相關头部

Vary 用来告诉缓存:同一 URL 在不同請求头下可能返回不同内容。對按设备、語言或登入狀態返回不同 HTML 的站点,缺少正确的 Vary 會让缓存把某一版本發给所有訪問者,抓取到的内容與预期不符。同时留意 Cache-Control 的取值,過長的缓存時間會让更新後的内容延迟生效,過短則增加回源压力。

五、一條可以直接执行的自查清單

  1. 列出站内所有會寫入响應头的环节:源站、反向代理、CDN、安全防護。
  2. 抽查首頁、主要栏目頁、内容頁、图片與 PDF 各若干條,確認没有意外的不索引指令。
  3. 確認 HTML 返回的 Content-Type 带正确字符集。
  4. 確認動態頁面有合理的 Last-Modified 或 ETag,且更新後數值會變。
  5. 確認需要区分版本的頁面配置了 Vary。
  6. 把以上配置寫進改版與上线流程,避免只在出問题时临时排查。

六、怎么快速检查

命令行下用 curl -I 加上目标地址,即可只取响應头,不必下载正文;對比不同路径的返回结果,差异通常一眼可见。浏览器開發者工具的 Network 面板也能看到同样的信息,适合核對單頁。若站点走 CDN,建议分別請求源站與 CDN 地址,確認两處头部一致。

响應头的調整往往牵一發動全身,改動前先记錄原始配置,改完後用同一批 URL 复检一遍,比事後凭印象回溯要可靠得多。

响應头不會让内容變好,但它决定了内容能不能被正确讀到。把這項检查纳入日常巡检,付出的時間不多,却能挡掉不少莫名其妙的抓取問题。