noindex / nofollow / disallow 区别与选用

三个控制项做三件不同的事。选错了,要么页面漏进索引、要么浪费抓取预算、要么把页面藏得连 Google 都掉不掉。

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 不要同时挂 noindexDisallow

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 仍可能没摘要出现。
  • 想让一条链接不传信任:用 nofollowsponsored / 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 同时挂 DisallownoindexDisallow 阻止抓取,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 是兜底手段。

相关阅读

标签: #独立开发 #SEO #Technical SEO #robots.txt #收录