两种方式告诉 Google 不索引页面:HTML 中的 robots meta 标签,或 HTTP 响应标头中的 X-Robots-Tag。它们作用相同。它们不可互换。选择合适的方案取决于文件类型(HTML vs PDF vs 图片)、你能编辑的位置(模板 vs 服务器配置),以及是否需要大规模应用(单个页面 vs 数万个)。
一句话概括两种机制
robots meta 标签:HTML 文档 <head> 中的 <meta name="robots" content="noindex, nofollow">。仅适用于 HTML 页面,因为 PDF / 图片 / JSON 元数据中没有等效项。可通过页面模板轻松添加。
X-Robots-Tag:X-Robots-Tag: noindex, nofollow 作为 HTTP 响应标头。适用于服务器返回的任何资源类型 — HTML、PDF、图片、视频、JSON、任何格式。在服务器(Apache、Nginx、Vercel edge headers、Cloudflare Workers)中配置,或通过框架的响应 API 配置。
何时选择 robots meta 标签
- 单页排除:你想不被索引的特定页面。将 meta 标签添加到该页面的模板,发布变更。
- 模板控制的页面:当按页面类型做出noindex决策时(例如,所有/thank-you/页面都应该被noindex)。在这些页面使用的布局模板中添加meta标签。
- 动态决策:当noindex取决于运行时数据时(例如,noindex少于200字的页面)。meta标签在模板中有条件地呈现。
- 当你没有服务器配置访问权限时:共享主机、锁定的CMS、只能编辑模板但不能编辑htaccess的机构部署。meta标签是你的唯一选择。
X-Robots-Tag是正确选择的情况
- 非HTML资源:PDF、图片、JSON端点、网站地图。你无法向PDF添加meta标签。HTTP响应中的X-Robots-Tag是唯一的方式。
- 基于模式的排除:「noindex /admin/*下的所有内容」或「noindex每个.pdf文件」。在服务器中配置一次,永久应用于每个匹配的URL。比编辑200个模板干净得多。
- 大规模排除:10,000个动态生成的URL不应被索引。单个Nginx位置块优于模板级条件。
- 当你想要多层防御时:在服务器上结合X-Robots-Tag和模板中的robots meta。任一层都能捕获noindex;两层意味着模板bug不会意外重新索引该页面。
两者都能设置什么
两种机制接受相同的指令集。最常见的:noindex(不索引)、nofollow(不跟随此页面的链接)、none(= noindex, nofollow)、noarchive(不显示缓存版本)、nosnippet(不在SERP中显示摘要)、max-snippet:N(限制摘要长度)、max-image-preview:standard|large|none(控制AI摘要中的图片预览——与2026 GEO工作相关)、max-video-preview:N(限制视频预览长度)、unavailable_after:date(在指定日期后自动noindex)。
Google 会读取相同的指令,无论通过哪种机制传递这些指令。机制选择关乎规模和资源类型,而非指令支持。
如何在常见平台上设置 X-Robots-Tag
Vercel (vercel.json)
使用 [[headers]] 块,配合源模式和 X-Robots-Tag 值条目。示例:[[headers]] source = "/admin/(.*)" [[headers.values]] X-Robots-Tag = "noindex, nofollow"。适用于所有匹配该模式的 URL。
Netlify (netlify.toml)
[[headers]] 块,配合路径 glob 和 values.X-Robots-Tag 设置。示例:[[headers]] for = "/admin/*" [headers.values] X-Robots-Tag = "noindex, nofollow"。
Apache (.htaccess)
<FilesMatch "\.pdf$"> Header set X-Robots-Tag "noindex, nofollow" </FilesMatch> 用于文件模式匹配。或使用 <Location /admin> Header set X-Robots-Tag "noindex, nofollow" </Location> 用于路径匹配。
Nginx
location ~ /admin/ { add_header X-Robots-Tag "noindex, nofollow"; } 在 server 块内。location ~ 按正则表达式匹配;使用 location ^~ 进行前缀匹配。
Cloudflare Workers / Edge
在 worker 脚本中修改响应头:response.headers.set('X-Robots-Tag', 'noindex, nofollow')。适用于源服务器无法轻松发送该头部的站点。
验证头部是否已设置
curl -I https://example.com/page 会返回所有响应头,包括 X-Robots-Tag。查找输出中的 X-Robots-Tag 行。如果缺失,则表示头部未被设置。
对于 Search Console 验证:URL 检查工具会显示 Google 从元标签和 HTTP 头部两层获取的指令。如果任一层设置了 noindex,Google 将不会索引该页面。值得检查两层,因为配置不当的 CDN 可能会无声地删除头部。
纵深防御模式
最强的生产环境设置使用两层。服务器级别的 X-Robots-Tag 用于路径模式(例如 /admin/*),加上模板级别的 robots 元标签在页面 <head> 中针对相同页面。两层防御意味着模板 bug 或 CDN 配置错误无法意外重新索引应该保持私密的页面。
本站的管理员部分就是这样配置的:vercel.json 在 /admin/* 上设置 X-Robots-Tag: noindex, nofollow,同时 AdminLayout 模板在 head 中发送 <meta name="robots" content="noindex, nofollow">。双重保险。
常见错误
- 在已由 robots.txt 阻止的页面上添加 noindex。robots.txt 中的 Disallow 会阻止 Googlebot 获取该页面,所以它永远看不到 noindex 指令。该页面最终可能在没有摘要的情况下被索引,因为 Google 在其他地方看到过该 URL 但无法获取它。删除 Disallow 规则,让 bot 可以获取并看到 noindex。
- 通过 JavaScript 渲染的 HTML 中的 meta 标签设置 noindex。有些爬虫执行 JS,有些则不执行。最保险的方式是在服务器端渲染 noindex meta 标签,或在 HTTP 头中使用 X-Robots-Tag,它不需要 JS 执行。
- 在有反向链接的页面上设置 noindex。Google 会尊重 noindex,但那些反向链接的链接权益就浪费了。更好的做法是用 301 将页面重定向到一个相关的 URL,让它吸收这些权益。
- 忘记 X-Robots-Tag 是按响应计算的,而不是按服务器计算的。CDN 缓存命中有时会剥离自定义头;部署后用 curl 验证。
总结
robots meta 标签:按页面,在 HTML 中,在模板级别编辑。X-Robots-Tag:按响应,在 HTTP 头中,在服务器级别编辑。两者都适用于 HTML;只有 X-Robots-Tag 适用于非 HTML。当 noindex 很重要时,两者都使用。
相关阅读:410 与 404 涵盖退役情况(URL 消失);301 与 302 与 307 与 308 涵盖重定向情况(URL 移动)。结合 noindex,它们是告诉 Google 如何处理 URL 的三个主要工具。