三周前你给一个感谢页、内部仪表盘、或者意外泄漏到生产的 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 覆盖了这个 URL | robots.txt 屏蔽了抓取 | 情况 1 |
curl 原始 HTML 里没有 robots meta,DevTools DOM 里却有 | JS 渲染的 noindex | 情况 2 |
带破缓存参数的 curl 有 noindex,普通 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: 会自己追上。
最短修复路径
按命中率排序:
- 看
robots.txt是不是Disallow了这个 URL → 40% 的情况。删掉 Disallow,让 Google 能抓到 noindex。 curl一次,确认 meta 在原始 HTML 里、不是 JS 加的 → 25% 的情况。- 清 CDN 缓存 → 15% 的情况。
- URL 检查 → “申请编入索引” → 15% 的情况(单纯是抓取慢)。
- 紧急情况:用 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 消失:
- URL 必须返回 200(暂时别 404/410——Google 必须能抓到)。
- 在 SSR HTML 里写
<meta name="robots" content="noindex">,或者用X-Robots-Tag: noindexheader。 - 确认
robots.txt没有 Disallow 这条 URL。 - URL 检查 → “申请编入索引”触发抓取。
- 等 Google 重抓(URL 检查的”上次抓取”时间会更新)。
- URL 检查现在显示”已被 ‘noindex’ 标签排除”——成功。
- (可选)等 Google 确认 noindex 之后,可以 410 或 404 这条 URL,彻底下线。
如果你在 Google 看到 noindex 之前就 410/404 了,Google 可能把 URL 留在索引里很久——它看到的只是”这条 URL 不响应了”,与”站长说不要收录”不是一回事。
怎么确认真的修好了
别拿 site: 当判断信号——它会滞后。按这个顺序确认:
- 原始抓取里有这条指令。
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。 - Google 在你改动之后抓过。 在 URL 检查里,“上次抓取”时间晚于你加
noindex的日期。如果还更早,点”申请编入索引”再等。 - 报告状态翻成成功态。 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’ 标签排除”。