noindex、nofollow、Disallow 在文档里长得很像,但在线上行为差别巨大。一个是「别出现在搜索结果」,一个是关于链接信号的提示,一个是「连抓都别抓」。选错了,要么页面漏进索引,要么抓取预算被垃圾消耗光,要么把页面藏到 Google 连「丢掉」都做不到。
问题背景
三个机制源自三个不同问题。Disallow(在 robots.txt 里)是 1994 年的原始标准:别抓这个路径。noindex(meta 标签或 HTTP header)是后来加的:「抓可以,别在搜索结果里展示」。nofollow(最初是反垃圾链接信号)告诉 Google 这条链接不要传 PageRank。它们写在不同文件里、在抓取的不同阶段触发、解决不同问题。
判断标准
- staging 页或感谢页出现在
site:yoursite.com结果里。 - Search Console Pages 报告里有「Indexed, though blocked by robots.txt」——两头都没占到。
- 想藏页面,给 robots.txt 加了
Disallow,URL 还是出现在搜索结果里,只是没摘要。 - 登录、购物车、admin 这些不该收录的页面在内链里吸走 PageRank。
快速结论
不想出现在搜索结果里(购物车、admin、内部工具、薄弱标签页)用 noindex。只在想让爬虫完全跳过的路径(搜索、过滤组合)用 Disallow。在你不背书的链接(UGC、付费链接)上用 nofollow。同一个 URL 不要同时挂 noindex 和 Disallow。
Disallow vs noindex 的陷阱
最常见的 bug:想藏一个页面,于是在 robots.txt 加了 Disallow。Google 听话,不再抓——但这个 URL 之前已经收录过了,现在 Google 抓不到页面就看不到你顺手加的 noindex。结果这个 URL 永远留在索引里,只是没描述。解决办法:先去掉 Disallow,让 Google 重新抓到,看到 noindex 干净下架。之后如果还要阻止抓取,再加回 Disallow。
<!-- 页面级 noindex(「别展示这页」最稳的默认值) -->
<meta name="robots" content="noindex, follow">
# robots.txt——阻止抓取,但不阻止收录
User-agent: *
Disallow: /search?
Disallow: /admin/
什么时候该用 nofollow
nofollow 是链接级别的,不是页面级别的。它说的是「我不为这条链接的去向背书」或「这是付费投放」。用在 UGC 里的外链、付费测评链接、联盟链接上——Google 还有更精确的属性名(rel="sponsored"、rel="ugc")。不要用 nofollow 去「省 PageRank」给外链数量封顶——那套玩法早就失效,现在反而像作弊信号。
<a href="https://example.com" rel="nofollow">不背书的去向</a>
<a href="https://partner.com" rel="sponsored">付费投放</a>
<a href="https://forum-comment.com" rel="ugc">用户评论</a>
决策表
- 不想出现在搜索里,但允许 Google 抓:只用
noindex。 - 爬虫永远别抓这个路径(量大、价值低、无限组合):只用
Disallow,并接受孤立 URL 仍可能没摘要出现。 - 想让一条链接不传信任:用
nofollow或sponsored/ugc。 - 想让页面彻底消失:先
noindex,等重新抓取,再视情况加Disallow。 - 想临时让整站不收录(staging):在响应头级别加
noindex,或挂 HTTP auth——绝不能只靠Disallow。
非 HTML 场景用 HTTP header
noindex 有两种写法:<meta> 标签(HTML 页面用)和 X-Robots-Tag 响应头(其它一切用)。PDF、JSON 接口、图片、任何响应不是 HTML 的 URL 都没法挂 meta 标签——在服务器或 CDN 层用 header 形式。
X-Robots-Tag: noindex, follow
多数 host 都能在配置文件里设置。Firebase Hosting 在 headers 块里写。Nginx 在 location 指令里写。Cloudflare 用 worker 或 transform rule。语义和 meta 标签完全一样,哪个先被 Google 看到就用哪个。
各信号的生效时间
noindex从索引里下架:下次抓取后 1-3 周。对 noindex 的 URL 主动 Request indexing 能加速。Disallow生效:下次抓取尝试时立刻生效,热门站点几小时,小站点几天。nofollow生效:下次抓取后链接权重立刻停止流出。已经传过去的 PageRank 不会回收。
一个常见意外:把页面上的 noindex 去掉,期待立刻被收录。Google 还得重新抓到才知道。挑一个代表 URL Request indexing 推一下,其余的几周内跟上。
容易踩的坑
- 同一个 URL 同时挂
Disallow和noindex。Disallow阻止抓取,Google 看不到noindex,URL 留在索引里。 - 把
nofollow当成「别收录这个链接目标」的信号。它控制链接权重,不控制收录。 - staging 用了
Disallow: /,上线时忘删。线上站默默拒绝抓取好几周。 - 临时屏蔽用过的共享 layout 模板里残留
noindex,然后纳闷为什么整站从搜索结果里消失。 - 在 canonical 替代页面(分页
?page=2、语言版本)上加noindex,把合法内容也下架了。
FAQ
Disallow了 URL 是否还会出现在搜索结果?: 有时会。如果有外链指向它,Google 可能列出 URL 但没描述。「别出现在搜索里」要用noindex。noindex, nofollow一起用合理吗?: 很少合理。noindex已经把页面从结果里去掉,加nofollow会把站内链权也封死。默认用noindex, follow,除非你真要彻底封闭。rel="sponsored"和nofollow有什么区别?: 都不传链接权,但sponsored明确说「这是付费投放」。准确时 Google 更喜欢精确属性。noindex后多久从索引里消失?: 一般下次抓取后 1-3 周。想加速就用 URL Inspection 的「Request indexing」对 noindex 的 URL 手动提交一次。- 薄弱的标签、分类页要不要
noindex?: 只在它们真没价值时。3 篇文章的薄弱标签页应该合并,不是 noindex。noindex 是兜底手段。