很多人把 meta robots 当成一个总开关:加了 noindex 就等于页面从搜索里消失。实际情况要复杂一些。抓取和索引是两个独立环节,meta robots 系列指令主要作用在索引这一侧,它对抓取的影响是间接的。
先分清抓取和索引
抓取是指蜘蛛把页面 HTML 拉回本地,索引是指系统决定这个 URL 要不要进入候选结果集。meta robots 写在 HTML 里,蜘蛛必须先完成抓取,才能读到它。所以一条 noindex 不会让蜘蛛不来,只会让它在读完页面之后,决定不把内容放进索引。
常见取值与实际边界
- noindex:不进索引,但仍可被抓取,页面上的链接通常也仍会被发现。
- nofollow:页级使用时,表示不建议继续追踪本页上的链接;链接级使用时,只针对那一条链接。
- noarchive:不提供缓存副本。
- nosnippet / max-snippet:控制摘要展示的长度。
- max-image-preview:控制图片预览的尺寸。
这里最容易被误解的是 noindex 和 nofollow 的关系。一个页面写了 noindex,通常不需要额外再写 nofollow。因为蜘蛛已经在抓这一页了,页面上指向其他 URL 的链接,依然是发现新地址的重要入口。把两者一起加,等于同时放弃这个页面的索引价值和它作为分发入口的作用。
页级 nofollow 与链接级 nofollow
页级写 meta name="robots" content="nofollow",是对整页所有链接生效,粒度很粗。链接级的 rel="nofollow" 才是更常用的做法,只加在某一条外链或用户生成内容上。遇到评论区、论坛签名这类位置,链接级处理更合适。
X-Robots-Tag 解决非 HTML 的问题
meta 标签只能写在 HTML 的 head 里。PDF、图片、视频这类文件没有 head,这时候要用 HTTP 响应头 X-Robots-Tag。它的取值和 meta robots 基本一致,只是写在服务端配置里,可以针对某个目录、某类扩展名统一设置。
如果某类文件经常被误抓,先看看能不能通过 X-Robots-Tag 加 noindex,而不是一刀切在 robots.txt 里屏蔽整个目录。
最容易踩的坑:robots.txt 拦住又写了 noindex
这是很常见的配置冲突。robots.txt 里的 Disallow 会阻止蜘蛛抓取某个目录,但同时也意味着蜘蛛永远读不到那个目录里页面上的 noindex 标签。结果就是 URL 仍可能因为有外部链接而被收录,只是以无摘要的形式出现。想用 noindex 让页面退出索引,前提是蜘蛛能抓到它。
所以顺序一般是:只想去索引,就允许抓取并加 noindex;想彻底不让抓取、也不太在乎索引状态,才用 robots.txt。
JS 注入的指令,可能来不及生效
如果 noindex 是前端框架在客户端渲染时插入 head 的,蜘蛛要在执行完 JS 之后才能看到。多数情况下这不影响最终判断,但会多消耗一次渲染资源,也增加了判断失败的几率。能放在服务端输出的指令,尽量放在服务端。
从抓取预算角度看 noindex 页面
noindex 不省抓取。一个页面只要可抓,蜘蛛就可能在多轮抓取中反复访问它,尤其是它还被内链指向、或者内容经常更新的时候。如果一批页面确实没有索引价值,又长期被大量抓取占用资源,可以考虑在 robots.txt 层面收口,代价是失去对索引状态的精细控制。两者之间需要权衡,而不是简单地两个都加。
一份可以照着走的检查顺序
- 先确认目标:是要退出索引,还是不想被爬,还是两者都要。
- 需要退出索引的页面,确认没有被 robots.txt 挡住,蜘蛛能正常读到响应头或 head。
- 检查指令是否真的输出在 HTML 源码里,而不是只在浏览器渲染后出现。
- 非 HTML 资源,检查响应头是否带了 X-Robots-Tag。
- 用抓取日志抽查这些 URL 的实际访问状态,确认返回码正常、没有被大量重定向。
- 改完指令后观察一段时间,重点看内链分发是否受影响,别把入口页一起收掉。
把这些指令当成抓取路径上的路标,而不是总闸,很多配置冲突会少很多。