meta robots 寫在頁面里,X-Robots-Tag 寫在 HTTP 响應头里。两者能表達的指令大部分重叠,但适用场景並不一样。当你要给一批非 HTML 文件、或者整個目錄统一加索引指令时,响應头通常比逐頁改模板更省事。
响應头與頁面标簽的關键差別
- 作用對象不同:meta 只能出現在 HTML 頁面的 head 中;X-Robots-Tag 可以挂在任意 HTTP 响應上,包括 PDF、图片、视频、安装包和 JSON 接口返回。
- 生效范围不同:meta 是頁面級的,响應头可以在服務器、反向代理或 CDN 层按路径批量下發,一次配置影响一批 URL。
- 改動方式不同:meta 往往要改模板再發布;响應头改配置即可,但別忽略 CDN 缓存,否則线上可能還留着舊指令。
- 可以定向到某個爬虫:响應头支持寫成「爬虫名: 指令」的形式,只對指定 UA 生效。
常见指令都表達什么
- noindex:請求不要把该 URL 放進索引。
- nofollow:不追踪该响應里出現的連結,多用于接口或非 HTML 资源。
- noarchive / nosnippet:限制快照和摘要展示,属于展示层控制,不改變索引本身。
- max-snippet、max-image-preview:给摘要長度和图片预览设上限。
- unavailable_after:给有时效的頁面标注一個時間点,之後不再展示。
语法上就是一行响應头,多個指令用逗号分隔:X-Robots-Tag: noindex, noarchive。要只针對某個爬虫,寫成 X-Robots-Tag: googlebot: noindex。在 Nginx 里通常是一條 add_header,挂在對應的 location 或文件類型上。
什么时候用它比 meta 更合适
- 非 HTML 资源:PDF、图片、视频文件里塞不進 meta,只能用响應头。
- 整目錄统一處理:測試子域、临时下载目錄、内部搜尋頁,按路径一次性下發。
- 按爬虫区別對待:同一份资源想對不同爬虫给出不同指令,頁面标簽做不到。
- 由基础设施统一控制:站点由多個团队维護、模板不统一时,在網關层收口更可靠。
几個容易踩的坑
- 响應头里的 noindex 要先被抓到才生效。如果该路径同时被 robots.txt 禁止抓取,爬虫拿不到响應,自然也讀不到指令。同一個 URL 上尽量不要同时用這两種方式處理。
- noindex 和 canonical 同时出現會互相矛盾。一個说不進索引,一個说以另一個 URL 為准,最好只保留一個明确信号。
- 指令没有覆盖所有响應。同一路径有时带指令有时不带,或者被 CDN 缓存成不同版本,表現會不稳定。改完记得刷新缓存並复查。
- 把它当成移除開關。响應头主要影响後續抓取时的處理,對已经進入索引的 URL,通常還需要配合其他方式,而且不一定立刻生效。
- 忽略各家爬虫的支持差异。展示類指令的支持程度並不一致,別預設所有搜尋引擎行為相同。
上线前的自检
- 用 curl -I 或浏览器開發者工具查看响應头,確認指令真的下發了,而不是只寫在配置文件里。
- 確認返回该资源的不同狀態响應都带一致的指令,避免同一路径出現两種行為。
- 小范围驗證几天,观察索引报告里對應 URL 的狀態是否按预期變化。
- 记錄改動時間和影响范围,方便後續排查與回滚。
说到底,X-Robots-Tag 是一個配置层面的開關。它解决的是「指令该寫在哪儿」的問题,不解决「頁面值不值得收錄」的問题。把低质量頁面挡在索引之外,前提仍然是内容本身有存在的理由。