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 是一个配置层面的开关。它解决的是「指令该写在哪儿」的问题,不解决「页面值不值得收录」的问题。把低质量页面挡在索引之外,前提仍然是内容本身有存在的理由。