三周前你给一个感谢页、内部仪表盘、或者意外泄漏到生产的 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: 会自己追上。
最短修复路径
按命中率排序:
- 看
robots.txt是不是Disallow了这个 URL → 40% 的情况。删掉 Disallow,让 Google 能抓到 noindex。 curl一次,确认 meta 在原始 HTML 里、不是 JS 加的 → 25% 的情况。- 清 CDN 缓存 → 15% 的情况。
- URL 检查 → “申请编入索引” → 15% 的情况(单纯是抓取慢)。
- 紧急情况:用 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 消失:
- 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 不响应了”,与”站长说不要收录”不是一回事。
预防建议
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 是给上述机制争取生效时间的缓冲。