设了 noindex 但页面还在搜索结果里

几周前加了 `<meta name="robots" content="noindex">` 但页面仍在 Google——按命中率排序的六种原因,附上用来区分它们的 curl 检查。

三周前你给一个感谢页、内部仪表盘、或者意外泄漏到生产的 staging 副本加了 <meta name="robots" content="noindex">。今天跑 site:yourdomain.com/that-url,Google 还在返回它。View Source 里 meta 标签明明在那里。怎么回事?

最快的答案: Google 只有在重新抓取这一页、并真正看到这个标签之后,才会根据 noindex 行动。用 Google 自己的话说,“如果页面被 robots.txt 屏蔽、或抓取器访问不到这一页,抓取器永远看不到 noindex 规则,页面就可能继续出现在搜索结果里”(Block Search indexing)。所以在做任何事之前,先跑一个检查:

# robots.txt 屏蔽了这个路径吗?如果是,这就是你的 bug。
curl -s https://yourdomain.com/robots.txt | grep -iE 'disallow|noindex'

如果有一条 Disallow 覆盖了这个 URL,删掉它——单这一步就能解决约 40% 的情况(抓取器终于能访问到页面、读到 noindex)。如果 robots.txt 是干净的,按命中率顺序往下看下面六种情况。

快速诊断

对线上 URL 跑下面这些检查,再对号入座:

你观察到的现象可能的情况跳转
robots.txt 有一条 Disallow 覆盖了这个 URLrobots.txt 屏蔽了抓取情况 1
curl 原始 HTML 里没有 robots meta,DevTools DOM 里却有JS 渲染的 noindex情况 2
带破缓存参数的 curlnoindex,普通 curl 没有CDN 缓存了旧 HTML情况 3
标签在原始 HTML 里,但”上次抓取”早于你改动的时间还没重抓情况 4
X-Robots-Tag header 与 meta 标签冲突信号冲突情况 5
site: 能搜到,但 URL 检查说”不在 Google 上”site: 滞后(其实已修好)情况 6

先判断你属于哪种情况

情况 1:robots.txt 屏蔽了抓取

最常见。Search Console 表现:网页编入索引报告(左侧栏 → 索引 → 网页)把这个 URL 列在”虽被 robots.txt 屏蔽,但仍被收录”下,或者 URL 检查显示”被 robots.txt 屏蔽”。

怎么发现:

curl -s https://yourdomain.com/robots.txt | grep -i your-path
# Disallow: /private/

原因:有人觉得”要让一页从 Google 消失,把它在 robots.txt 屏蔽掉就好”。这会停掉抓取,但不会把 URL 从索引里移除——外链导入的索引条目依然存在、只是没有摘要。你加的 meta noindex 因为 Google 永远不去取这一页,永远看不到。

修复:删掉这条 URL 的 Disallow。Google 必须能抓取,才能看到 noindex 并执行移除。移除生效后,URL 通常在 1–4 周内退出索引。

# robots.txt——之前
User-agent: *
Disallow: /private/

# robots.txt——之后(允许抓取,meta noindex 才能生效)
User-agent: *

要永久排除:保留 meta noindex、删掉 Disallow。两者互斥——noindex 必须能被抓到。

情况 2:noindex 是客户端 JS 渲染的

怎么发现:

# 服务端原始 HTML
curl -s https://yourdomain.com/path | grep -i "name=\"robots\""
# (没有输出——初始 HTML 里没有 meta)

但在 Chrome DevTools → Elements(显示 JS 跑完的 DOM)里能看到 meta。Search Console URL 检查 → “查看抓取的网页”:HTML 那一栏没有 meta,“已渲染的 HTML”里却有。

原因:客户端框架(React、Vue)在 hydration 之后注入 robots meta。Googlebot 本次抓取可能执行 JS 也可能不执行。没执行时,它看不到 noindex,URL 继续留在索引里。

修复:把 noindex 写进 SSR HTML,让它出现在 Googlebot 真正抓到的那份响应里,而不是事后追加。SPA 要保证服务端返回的初始 <head> 里就有这一行。如果你完全改不了渲染出的 HTML(静态托管、没有 SSR),就改用 HTTP 响应头下发指令——X-Robots-Tag: noindex 在任何 JS 运行之前就会被读到,是推荐的退路。验证方式:确认 noindex 出现在原始 curl 输出里,而不只是 DevTools 的 DOM 里。

情况 3:CDN 在返回旧 HTML

怎么发现:

# 加一个破缓存参数
curl -s "https://yourdomain.com/path?cb=$(date +%s)" | grep -i robots
# noindex 出现

# 普通请求
curl -s "https://yourdomain.com/path" | grep -i robots
# noindex 不见

带破缓存参数与不带的结果不同 = CDN 缓存。

原因:Cloudflare、Vercel Edge、CloudFront 等会缓存 HTML 响应。你加 noindex 之前的版本已经被缓存了,CDN 会在缓存 TTL(常见 24h–7d,有时更久)内继续给 Googlebot 返回旧版本。

修复:清这条 URL 的 CDN 缓存。

# Cloudflare
curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE/purge_cache" \
  -H "Authorization: Bearer $CF_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"files":["https://yourdomain.com/path"]}'

Vercel 重新部署即可让边缘缓存失效。Netlify 用 netlify cache:clear。清完再 curl 一次确认响应里有 meta 标签。

情况 4:Google 还没重抓

怎么发现:Search Console → URL 检查 → “上次抓取”时间早于你加 noindex 的时间。

原因:低流量页的抓取频率可能是几周到几个月——Google 文档里写”Googlebot 重访一个页面可能需要数月”。meta 在 HTML 里,但 Googlebot 在你加 noindex 之后没来过。

修复:URL 检查 → “申请编入索引”。是的,noindex 页也可以申请编入索引——听上去反直觉,但它只是用来触发重抓;Google 取到页面、读到 noindex,就会把 URL 从索引里删掉。截至 2026 年 6 月的典型时间线:高流量站几天,低流量站 2–4 周。“申请编入索引”有每日配额,所以提交那个最要紧的 URL,别一次性批量提交。

情况 5:meta 与 X-Robots-Tag 信号冲突

怎么发现:

curl -sI https://yourdomain.com/path | grep -i x-robots
# X-Robots-Tag: index, follow   <-- 与 meta noindex 冲突

原因:HTML 里 meta 写 noindex,HTTP header 却写 index。Google 合并时取最严格的值,所以这种组合本应生效——但如果 CDN 同时抹掉或覆盖了 header,meta 标签也可能跟着丢。

修复:完整冲突解析见 Meta robots vs X-Robots-Tag——谁说了算。简单说:要么两者对齐,要么只用其中一种。

情况 6:site: 查询的滞后

怎么发现:

# Google 搜索里
site:yourdomain.com/that-url
# 仍能搜到

# 但 Search Console URL 检查写:
# "URL 不在 Google 上"

原因:site: 操作符的结果有时比实际索引状态慢一拍。URL 可能已经离开了正常搜索结果,但 site: 还能查到几天。

修复:用 URL 检查作为信源,不要看 site:。URL 检查说”URL 不在 Google 上”,就说明已经从结果中移除了——site: 会自己追上。

最短修复路径

按命中率排序:

  1. robots.txt 是不是 Disallow 了这个 URL → 40% 的情况。删掉 Disallow,让 Google 能抓到 noindex。
  2. curl 一次,确认 meta 在原始 HTML 里、不是 JS 加的 → 25% 的情况。
  3. 清 CDN 缓存 → 15% 的情况。
  4. URL 检查 → “申请编入索引” → 15% 的情况(单纯是抓取慢)。
  5. 紧急情况:用 Removals 工具 → 临时屏蔽 6 个月,等上面的链路生效。

正确使用 Removals 工具

Search Console → 索引 → 删除(Removals)→ 新建请求 → “暂时移除网址” → 选”仅移除此网址”或”移除此前缀下的所有网址”:

  • 效果:把 URL 从 Google 搜索里隐藏大约 6 个月(截至 2026 年 6 月,这是 Google 文档给的时长)。
  • 关键:这是屏蔽,不是移除。URL 仍在 Google 索引里。大约 6 个月后请求过期,如果 noindex 还没生效,URL 会回来。
  • 只作为 noindex 生效前的临时手段。Google 明确说,这 6 个月是给你时间去落实一个永久方案。

常见误用:提了 Removals 请求就以为完事。没有 noindex(或者 robots.txt Disallow + 410),6 个月后 URL 又回来。详见 URL Removals 工具的常见误用

永久移除的正确顺序

要让某页永远从 Google 消失:

  1. URL 必须返回 200(暂时别 404/410——Google 必须能抓到)。
  2. 在 SSR HTML 里写 <meta name="robots" content="noindex">,或者用 X-Robots-Tag: noindex header。
  3. 确认 robots.txt 没有 Disallow 这条 URL。
  4. URL 检查 → “申请编入索引”触发抓取。
  5. 等 Google 重抓(URL 检查的”上次抓取”时间会更新)。
  6. URL 检查现在显示”已被 ‘noindex’ 标签排除”——成功。
  7. (可选)等 Google 确认 noindex 之后,可以 410 或 404 这条 URL,彻底下线。

如果你在 Google 看到 noindex 之前就 410/404 了,Google 可能把 URL 留在索引里很久——它看到的只是”这条 URL 不响应了”,与”站长说不要收录”不是一回事。

怎么确认真的修好了

别拿 site: 当判断信号——它会滞后。按这个顺序确认:

  1. 原始抓取里有这条指令。 curl -s https://yourdomain.com/path | grep -i robots 必须显示 noindex。如果走的是 HTTP header,那 curl -sI https://yourdomain.com/path | grep -i x-robots 必须显示 X-Robots-Tag: noindex
  2. Google 在你改动之后抓过。 在 URL 检查里,“上次抓取”时间晚于你加 noindex 的日期。如果还更早,点”申请编入索引”再等。
  3. 报告状态翻成成功态。 URL 检查(或网页编入索引报告)把这个 URL 列在 “已被 ‘noindex’ 标签排除” 下。这就是确认已移除的状态——一旦出现在这里,即便 site: 还在回显,线上搜索结果也会在几天内消失。

如果 8 周后 URL 在 URL 检查里仍是”已编入索引”,说明抓取在某处被挡住了——回到快速诊断表重跑一遍,重点查 robots.txt、纯 JS 渲染、CDN 缓存。

预防建议

  • noindex 写进 SSR HTML——绝不用客户端 JS。
  • 同一 URL 绝不同时 noindex + robots.txt Disallow
  • 改完 robots meta 后清 CDN 缓存。
  • 非 HTML(PDF、图片)用 X-Robots-Tag——meta 写不进去。
  • 永远不想被收录的页(admin、内部工具)放到登录后——比任何 robots 指令都靠谱,因为 Google 根本看不到内容、也就无从收录。

Google 关于支持语法与行为的官方参考:Block Search indexing with noindex

FAQ

Q:几周前加了 noindex,多久 URL 才会从搜索消失? A:典型时间线:Google 首次重抓后 1–4 周。8 周后还在,说明抓取被挡住了——查 robots.txt、JS 渲染的 meta、CDN 缓存。

Q:同时 noindex + robots.txt Disallow,是不是更保险? A:不是——这种组合反而会让 noindex 失效。Disallow 阻止抓取,Google 永远看不到 meta,URL 一直留在索引里(常带”虽被 robots.txt 屏蔽,但仍被收录”标注)。只能二选一:noindex(能抓,从索引移除) robots.txt Disallow(不抓,但外链信号可能让 URL 留在索引)。

Q:noindex 会不会丢外链权重? A:noindex, follow 会让页面通过出站链接传递权重,但页面自身不参与排名;noindex, nofollow 两者都不传。大多数场景要的是 noindex, follow——直接写 noindex 时的默认。

Q:Search Console 显示”已被 noindex 标签排除”,但 site: 还能搜到。到底有没有被移除? A:被移除了。“已被 noindex 标签排除”是成功状态。site: 操作符滞后属正常,几天内会同步。URL 检查才是信源。

Q:Removals 工具能永久移除 URL 吗? A:不能——只是大约 6 个月屏蔽。永久移除还是要靠 noindex(或登录墙、或 410)。Removals 是给上述机制争取生效时间的缓冲。

Q:<meta name="robots"> 够用吗,还是必须用针对 googlebot 的标签? A:<meta name="robots" content="noindex"> 对所有遵循规则的抓取器(包括 Googlebot)都生效,是正确的默认选择。只有当你想专门针对 Google 设规则时(比如对 Google 用 noindex、但允许另一个引擎收录),才用 <meta name="googlebot" content="noindex">。别在同一页上同时放两条、值还相互冲突。

Q:我都加了 noindex 了,为什么页面还是”虽被 robots.txt 屏蔽,但仍被收录”? A:这个状态正是情况 1 的铁证。Disallow 这一行挡住了 Googlebot 抓取,它就永远读不到你的 noindex。删掉 Disallow、申请编入索引,下次抓取后状态会变成”已被 ‘noindex’ 标签排除”。

相关阅读

标签: #SEO #排查 #排查 #结构化数据 #noindex