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

几周前加了 `<meta name="robots" content="noindex">` 但页面仍在 Google——最常见的几种原因。

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

最值得记住的一点:Google 必须重新抓到这一页,才能根据 noindex 行动。只要任何环节阻碍了抓取——robots.txt Disallow、JS 渲染的 noindex、CDN 缓存的旧 HTML——Google 永远看不到这条指令,URL 就一直留在索引里。下面按命中率从高到低列出每种原因。

先判断你属于哪种情况

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

最常见。Search Console 表现:URL 检查显示”虽被 robots.txt 屏蔽,但仍被收录”或”被 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。SPA 也要保证服务端返回的初始 HTML 的 <head> 里就有这一行,而不是事后追加。

情况 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 的时间。

原因:低流量页的抓取频率可能是几周到几个月。meta 在 HTML 里,但 Googlebot 在你加 noindex 之后没来过。

修复:URL 检查 → “申请编入索引”。是的,noindex 页也可以申请编入索引——这是为了触发重抓,Google 取到后看到 noindex 就会把 URL 从索引中移除。典型时间线:高流量站 1–7 天,低流量站 2–4 周。

情况 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 → 删除 → 新建请求 → URL prefix(或精确 URL):

  • 效果:把 URL 从 Google 搜索结果里隐藏大约 6 个月。
  • 关键:这是屏蔽,不是移除。URL 仍在 Google 索引里。6 个月后如果 noindex 没生效,URL 会回来。
  • 只作为 noindex 生效前的临时手段。

常见误用:提了 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 不响应了”,与”站长说不要收录”不是一回事。

预防建议

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

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 是给上述机制争取生效时间的缓冲。

相关阅读

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