robots.txt 须严格遵循User-agent分段空行分隔、Disallow前缀匹配规则(如/api/而非/api);meta robots仅适用于HTML,X-Robots-Tag更可靠且支持任意资源类型;noindex与canonical共存易致失效,动态页面需服务端精准识别爬虫UA并响应对应指令。

robots.txt 里 User-agent 和 Disallow 怎么写才有效
很多网站把 robots.txt 当成“开关”,以为加一行 Disallow: /admin/ 就万事大吉,结果发现搜索引擎还是索引了不该索引的页面。根本原因是没理解 User-agent 的匹配逻辑和路径规则的优先级。
常见错误:用通配符 * 写 User-agent: * 后,又在同个文件里写多个 User-agent 段落却不加空行分隔;或误以为 Disallow: /api 能屏蔽 /api/v1/users 和 /api-docs —— 实际上它只匹配开头为 /api 的路径,/api-docs 不会被拦截(因为 /api 是前缀,不是子路径)。
-
User-agent必须独占一行,不同段落之间必须用空行分隔 -
Disallow值是路径前缀匹配,不是正则;想屏蔽所有 API 相关路径,得写Disallow: /api/(末尾加斜杠) - Googlebot 和 Bingbot 对
Allow支持较完善,但旧爬虫可能忽略;有冲突时,最具体的规则优先生效(如Allow: /public/image.jpg在Disallow: /public/之后,会放行该文件) - 绝对不要在
robots.txt里暴露敏感路径,比如Disallow: /wp-config.php—— 这等于告诉所有人这个文件存在
meta robots 和 X-Robots-Tag 哪个更可靠
meta name="robots" content="noindex" 只对 HTML 页面生效,且依赖页面被成功抓取并解析;而 X-Robots-Tag 是 HTTP 响应头,能控制任意类型资源(PDF、JSON、图片),也适用于服务器端渲染或动态生成的页面。
典型翻车场景:单页应用(SPA)首页返回 200,但内部路由由前端路由控制,搜索引擎抓取时只拿到一个空壳 HTML —— 此时 meta 标签无效,必须靠服务端根据 URL 动态注入 X-Robots-Tag: noindex 响应头。
立即学习“前端免费学习笔记(深入)”;
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
- 静态 HTML 页面,优先用
meta robots,简单直接 - API 返回的 HTML 片段、SSR 页面、非 HTML 资源,必须用
X-Robots-Tag -
noindex, follow和noindex, nofollow效果差异很大:前者允许爬虫顺着链接发现新页面,后者彻底切断链接权重传递 - 注意缓存:CDN 或反向代理可能缓存带
X-Robots-Tag的响应,导致本该被索引的页面长期卡在noindex状态
Google Search Console 报 “已禁止索引” 但页面还在搜索结果里
这通常不是 robots.txt 或 meta 失效,而是 Google 还没重新抓取和处理最新指令。更隐蔽的原因是:页面被其他站点大量外链引用,Google 认为“用户需要访问它”,即使你写了 noindex,也可能先保留快照,等后续确认再下线。
另一个高频陷阱:页面返回 200 状态码 + noindex,但同时存在 rel="canonical" 指向另一个可索引页面 —— Google 可能直接忽略 noindex,转而索引 canonical 目标页,并把当前页当作重复内容合并处理。
- 检查实际响应头和 HTML 源码,确认
X-Robots-Tag或meta确实存在且拼写正确(大小写敏感,NOINDEX无效) - 用 GSC 的 URL 检查工具“实时抓取并索引”,强制触发重新评估
- 如果页面已删除,返回
404或410比noindex更快退出搜索结果 - 避免
noindex和canonical共存于同一页面,尤其当 canonical 指向外部域名时,Google 可能直接无视你的 noindex
动态渲染页面如何防止被误索引
现代框架(React/Vue)常配合 SSR 或预渲染,但构建配置稍有偏差,就可能让爬虫拿到两份内容:一份是带完整 DOM 的静态 HTML(应索引),另一份是空壳 HTML + JS(不应索引)。关键在于确保服务端对爬虫 UA 返回预渲染内容,同时不给普通用户返回冗余的 noindex。
最容易被忽略的一点:Node.js 或 Nginx 层做 UA 判断时,只匹配 Googlebot,却漏掉了 Googlebot-Image、Googlebot-News 等变体,导致图片或新闻搜索仍索引到错误版本。
- 用
useragent库或正则完整匹配主流爬虫 UA,例如:/googlebot[-\w]*/i - 预渲染服务返回的 HTML 中,不要硬编码
noindex;应由服务端根据请求 UA 动态决定是否插入meta或设置X-Robots-Tag - 在
robots.txt中明确放行预渲染目录(如Disallow: /ssr/→ 改为Allow: /ssr/),避免爬虫连预渲染入口都进不去 - 验证方式:用 curl 模拟 Googlebot 请求,检查响应头和 body 是否一致,而不是只看浏览器里看到的内容
真正难的不是写对某一行 Disallow,而是理清整个链条:爬虫怎么发现 URL、怎么请求、服务端怎么响应、HTML 怎么解析、Google 怎么决策。任何一个环节断掉或矛盾,都会让 robots 指令失效。尤其是混合了客户端路由、服务端渲染、CDN 缓存的项目,必须逐层验证,不能只改一处就以为搞定了。


















