做站点维护时,robots.txt、meta robots 和响应头里的 X-Robots-Tag 经常被放在一起讨论,因为它们看起来都在表达“别管这个页面”。但三者管的环节并不相同:一个决定爬虫要不要来抓,另外两个决定抓到的内容要不要进索引。把顺序用反,页面往往既没有按预期从索引里消失,又在很长一段时间里失去了被抓取的机会。
抓取屏蔽和索引屏蔽,不是一回事
- 抓取屏蔽:禁止爬虫请求某个 URL 或目录,页面内容不会被读取。
- 索引屏蔽:允许爬虫读取页面,但要求不要把内容放进索引、不要展示摘要或快照。
这里有个容易被忽略的前提:noindex 写在 HTML 里或者响应头里,爬虫必须先完成抓取才能看到它。如果同一批 URL 已经在 robots.txt 中被禁止抓取,爬虫不会去取页面,也就读不到 noindex,索引里的旧记录可能长期留着。这就是“想删页面,结果只挡住了抓取”的典型场景。
三个指令的作用位置
robots.txt
文件放在站点根目录,按 User-agent 加 Disallow 的规则控制抓取范围,作用于整站或整个目录,粒度粗但生效早。它的优点是节省抓取资源,代价是被挡住的 URL 无法通过页面内的指令再做调整。
meta robots
写在单个页面的 head 里,可以精细到“这个页面不索引,但链接可以继续跟”。适合处理单个页面或某类模板页,前提是爬虫能正常抓到这个页面。
X-Robots-Tag
通过 HTTP 响应头下发,作用范围与 meta robots 类似,但能覆盖非 HTML 资源,比如 PDF、图片,也能在无法修改页面模板时由服务端统一控制。多个来源同时出现时,限制更强的指令通常会被优先采用。
几种常见的错位写法
先封抓取,再等索引掉
想让一批页面从索引里退出,正确顺序是先放开抓取,让爬虫能读到 noindex,等索引状态更新之后,再决定是否需要收紧抓取。反过来操作,等于把一个爬虫看不到的指令留在原地。
把 noindex 用在需要被抓的页面上
有些页面希望站内链接继续被跟踪、传递信号,却不希望自己出现在结果里,这时用 noindex 是合适的;但如果在 robots.txt 里直接屏蔽,链接关系也会一并断掉。
忽略响应头的覆盖面
服务端统一加了 X-Robots-Tag,前端又单独给某个目录配置了放开规则,两边就容易互相打架。改版、CDN 迁移、反向代理配置之后,建议重新确认一次响应头。
自查顺序
- 先用抓取工具或日志确认目标 URL 的实际响应状态与响应头,别只看后台配置。
- 检查 robots.txt 是否屏蔽了这些 URL;如果屏蔽了,先判断是“确实不想被抓”还是“只是想让页面退出索引”。
- 确认这条规则的语法是否写得过宽,比如误把整个目录或带参数的路径都包含进去。
- 检查页面 head 与响应头中的 robots 指令,看是否存在冲突或重复下发。
- 对已经被屏蔽抓取的页面,先放开、再让爬虫读到 noindex,等待状态更新后再收紧。
- 记录修改时间和预期状态,过一段时间对照索引状态报告复查,而不是改完就当完成。
怎么选更稳妥
- 整站或大目录下大量低价值 URL、且不关心它们的链接关系:robots.txt 更省抓取资源。
- 单个页面要从索引移除,同时希望保留站内链接结构:noindex。
- 非 HTML 文件、或页面模板无法改动:X-Robots-Tag。
- 只是不想展示摘要或快照,而不是不想收录:用 nosnippet、noarchive 这类更细的指令,别直接上 noindex。
判断标准很简单:先问“这个 URL 我还需不需要被抓”,再问“抓到了要不要用”。第一个问题的答案决定用不用 robots.txt,第二个问题的答案决定用不用 noindex。
把这三层指令当成一个有先后顺序的流程来看,大部分“改了没反应”的问题都能对上原因。真正的难点不在记语法,而在于每次改动前先想清楚目标是抓取层面还是索引层面,改完再留一个复查节点。