返回博客

SEO优化

深入理解 Robots.txt:从原理到规范化编写的完整指南

2026-10-19

阅读约:25分钟

一句话导读:robots.txt 是网站与爬虫之间的”君子协定”。它决定了搜索引擎与 AI 爬虫能看什么、不能看什么。理解它的匹配逻辑,比背下几条指令重要得多。

一、什么是 robots.txt

robots.txt(全称 Robots Exclusion Protocol,爬虫排除协议)是放置在网站根目录下的一个纯文本文件,用于向网络爬虫声明本站哪些资源可以被抓取、哪些不可以。

项目说明
文件类型纯文本(text/plain)
文件名固定为 robots.txt(区分大小写,必须全小写)
放置位置网站根目录,如 https://example.com/robots.txt
生效范围仅对该域名/协议+主机下的路径生效
协议性质自愿遵守,不具备强制力
现行标准RFC 9309(2022 年正式标准化)

起源:1994 年由荷兰工程师 Martijn Koster 等人提出,最初用于阻止爬虫抓取服务器上的敏感目录。此后逐渐被各大搜索引擎事实采纳,最终于 2022 年被 IETF 收录为正式建议标准 RFC 9309。

【重要认知】robots.txt 不是安全工具

它只是一份”礼貌请求”,无法阻止恶意爬虫、攻击者、普通用户访问你的页面。任何忽略该协议的程序都可以照常抓取。因此:

  • 不要把私密内容的安全寄托在 robots.txt 上;
  • 真正的访问控制应使用 身份认证、登录态、IP 白名单、WAF 等手段;
  • robots.txt 的正确定位是 抓取预算管理与收录控制。

二、Robots.txt 的工作机制

关于状态码的关键结论:

HTTP 状态码爬虫的处理方式风险提示
200 OK正常解析文件内容标准情况
404 Not Found视为允许抓取全部内容想”屏蔽全站”却删掉文件,反效果
403 ForbiddenGoogle 视为”允许抓取”不要用 403 当屏蔽手段
401 / 402Google 视为”允许抓取”—
429 / 5xx视为禁止抓取全部,稍后重试服务器故障可能误封全站
3xx 重定向跟随重定向;若指向其它主机或超限则视为禁止规则会跟随到目标文件

【坑点预警】 很多站长想屏蔽全站,直接删除了 robots.txt。但由于服务器返回 404,爬虫会认为允许抓取全部,结果适得其反。要屏蔽全站,应显式写入 User-agent: * + Disallow: /。

三、文件规范:位置、命名与限制

3.1 位置:必须位于协议的”根目录”

robots.txt 的 URL 由 scheme + host + /robots.txt 组成,路径是写死的:

正确 ✅错误 ❌
https://example.com/robots.txthttps://example.com/sub/robots.txt(子目录无效)
http://example.com/robots.txthttps://example.com/robots.txt.bak(文件名错误)
https://www.example.com/robots.txthttps://example.com/robots/robots.txt

3.2 分协议 / 子域名独立

  • HTTP 与 HTTPS 是两套:在 http:// 与 https:// 下分别放置,互不影响。
  • 每个子域名独立:www.example.com 与 blog.example.com 各自需要自己的文件。
  • 每个端口独立:非标准端口需单独处理。

3.3 编码与体积限制

规范项建议
字符编码UTF-8(避免 GBK 等导致乱码)
大小限制Google 仅读取前 500 KiB(约 512 KB);超出部分被忽略
行长度单行建议不超过 500 字节
大小写文件名必须小写;指令名大小写不敏感,但路径区分大小写

四、指令语法全集

一个标准的 robots.txt 由 若干条”记录(record)” 组成。每条记录 = 一个或多个 User-agent + 若干条规则指令,记录之间用空行分隔。

# 这是一条注释:给所有爬虫的通用规则
User-agent: *
Disallow: /admin/
Allow: /admin/public/
Sitemap: https://example.com/sitemap.xml

4.1 核心指令一览

指令作用示例是否主流支持
User-agent指定该组规则作用的爬虫User-agent: Googlebot✅ 全部
Disallow禁止抓取的路径Disallow: /private/✅ 全部
Allow允许抓取的路径(优先级高于同长度 Disallow)Allow: /private/public/✅ 主流
Sitemap声明站点地图地址Sitemap: https://ex.com/sitemap.xml✅ 主流
Crawl-delay抓取间隔秒数Crawl-delay: 10⚠️ 部分(Bing/Yandex 支持,Google 忽略)
Clean-param忽略指定 URL 参数Clean-param: ref /⚠️ 仅 Yandex
Host指定主域名Host: example.com⚠️ 已基本弃用
Noindex请求不要收录(非标准)Noindex: /page❌ 不要使用

4.2 User-agent:指定爬虫

  • User-agent: * —— 通配符,代表所有未被其它记录特别指定的爬虫。
  • User-agent: Googlebot —— 精确匹配某个爬虫标识(区分大小写不敏感,但标识本身要拼对)。
  • 多条 User-agent 可共用一个规则块:
User-agent: Googlebot
User-agent: Bingbot
Disallow: /no-index/

【原理提示】 爬虫会优先匹配与自己标识最具体的一条记录;只有在没有专属记录时,才回退到 User-agent: *。因此”精确指定”的优先级高于”通配符”。

4.3 Disallow:禁止访问

  • Disallow: / —— 禁止抓取整站。
  • Disallow:(留空)—— 允许抓取全部(等价于不禁止)。
  • Disallow: /admin/ —— 禁止 /admin/ 目录及其下全部内容。
  • 多个 Disallow 逐条累加:
User-agent: *
Disallow: /admin/
Disallow: /tmp/
Disallow: /*.pdf$

4.4 Allow:精准放行

Allow 用于在 Disallow 的大范围内”开一个口子”,优先级更高:

User-agent: *
Disallow: /images/
Allow: /images/logo.png
Allow: /images/icons/

4.5 通配符:* 与 $

符号含义示例匹配对象
*匹配任意数量字符Disallow: /*.php任意以 .php 结尾的路径
$匹配URL 结尾(锚定)Disallow: /*.pdf$精确以 .pdf 结尾
无 $前缀匹配,向后延伸Disallow: /doc/doc、/docs、/document.html 都会命中

【易错点】 Disallow: /tmp 不会只匹配 /tmp,还会匹配 /tmpfoo、/tmp/bar.php。若只想限制目录,请写成 Disallow: /tmp/(带斜杠)。

4.6 注释、空行与空白

  • # 开头的内容为注释,# 也可出现在行尾。
  • 空行用于分隔不同的记录组,不是必须,但强烈建议保留以增强可读性。
  • 指令名与值之间的空格数不影响解析;但值内部的空格是路径的一部分。

五、匹配规则与优先级

理解匹配逻辑,是规范编写 robots.txt 的核心。Google 等主流引擎遵循 “最长匹配优先,其次 Allow 优先” 的算法:

匹配算法:先找出所有能被 URL 路径匹配的规则,选择**规则路径最长(最具体)**的那条;若长度相同,Allow 优先于 Disallow。

场景规则结果
具体 Allow 覆盖宽泛 DisallowDisallow: /a/ + Allow: /a/b//a/b/c 被允许
同长度冲突Disallow: /a/ + Allow: /a/允许(Allow 胜出)
前缀 vs 精确Disallow: /a/ + Disallow: /a/b//a/b/x 命中更长的 /a/b/
通配符拓展Disallow: /*.js$所有 .js 文件被屏蔽

【实践建议】 不要试图用极少的规则”覆盖所有情况”。robots.txt 不支持正则,过度依赖通配符会让规则难以维护、难以排查。

六、常见场景实战示例

6.1 屏蔽全站(慎用)

User-agent: *
Disallow: /

6.2 只允许某搜索引擎,屏蔽其他所有爬虫

# 先放行目标爬虫
User-agent: Googlebot
Disallow:

# 再屏蔽其余全部
User-agent: *
Disallow: /

6.3 屏蔽后台、临时目录与搜索结果页

User-agent: *
Disallow: /admin/
Disallow: /tmp/
Disallow: /search
Disallow: /*?
Disallow: /*.pdf$
Disallow: /*.json$

Sitemap: https://example.com/sitemap.xml

6.4 屏蔽指定目录但放行其中的静态资源

User-agent: *
Disallow: /assets/
Allow: /assets/css/
Allow: /assets/js/
Allow: /assets/img/

6.5 针对 AI 训练爬虫的声明(2024 年后的新常态)

User-agent: GPTBot
Disallow: /

User-agent: CCBot
Disallow: /

User-agent: Google-Extended
Disallow: /

User-agent: anthropic-ai
Disallow: /

【趋势观察】 随着大模型训练与 AI 检索兴起,GPTBot、ClaudeBot、PerplexityBot、Google-Extended、Bytespider 等 UA 成为 robots.txt 的新常客。是否屏蔽,取决于你对”内容被 AI 引用”的策略。

6.6 分 UA 精细化控制

# 正常搜索引擎:完整放行
User-agent: Googlebot
User-agent: Bingbot
Disallow:

# 采集类/SEO 工具爬虫:全面屏蔽
User-agent: AhrefsBot
User-agent: SemrushBot
User-agent: MJ12bot
Disallow: /

# 其余爬虫:屏蔽敏感目录
User-agent: *
Disallow: /admin/
Disallow: /cart/

七、主流搜索引擎与 AI 爬虫的支持差异

特性GoogleBingBaiduYandex说明
Disallow✅✅✅✅全平台支持
Allow✅✅✅✅Google 支持最完善
* 通配符✅✅✅✅—
$ 锚定✅✅⚠️✅百度支持有限
Sitemap✅✅✅✅建议直接放 sitemap
Crawl-delay❌ 忽略✅⚠️✅Google 请用 Search Console 限速
Clean-param❌❌❌✅Yandex 专属
最大读取体积500 KiB较大——超出不解析
大小写敏感(路径)✅✅✅✅路径区分大小写

【跨引擎建议】 若追求”一处编写、多处兼容”,请只使用最基础的 User-agent / Disallow / Allow / Sitemap 四件套,避免依赖 Crawl-delay、Clean-param 等私有扩展。

八、robots.txt 与其他控制手段的边界

很多同学把”不想被收录”和”不想被抓取”混为一谈。二者机制完全不同:

手段作用位置能否阻止收录
robots.txt阻止抓取站点根目录文件❌ 不能(仅减少抓取)
<meta name="robots" content="noindex">阻止收录具体页面 <head>✅ 能
X-Robots-Tag HTTP 头阻止收录(含非 HTML 文件)服务器响应头✅ 能
登录墙 / 权限阻止访问应用层✅ 间接
sitemap.xml主动告知页面站点根目录反向促进收录

【关键组合】 想让某页面既不收录也不被抓取,正确姿势是:先用 robots.txt 放行该页(或至少不禁止),同时在该页 <head> 里写 noindex。因为如果 robots.txt 禁止了抓取,爬虫就读不到页面上的 noindex,页面可能因外部链接而仍被收录(”无摘要收录”)。

九、测试与验证方法

工具用途入口
Google Search Console – Robots.txt 测试工具验证规则、查看某 URL 是否被屏蔽Search Console → 设置 → robots.txt
Google Rich Results / URL 检查检查单个 URL 的可抓取性URL Inspection
Bing Webmaster – Robots.txt TesterBing 规则验证Bing 站长工具
百度搜索资源平台 – robots 检测百度规则验证百度站长工具
命令行 curl确认状态码与内容curl -I https://example.com/robots.txt
# 确认 robots.txt 返回状态码与响应类型
curl -I https://example.com/robots.txt

# 直接查看内容
curl https://example.com/robots.txt

十、规范化编写最佳实践(Checklist)

  • 文件位于根目录,命名为全小写 robots.txt
  • 使用 UTF-8 编码,单行不超过 500 字节,总体不超过 500 KiB
  • 默认放一条 User-agent: * 兜底记录
  • Disallow: / 屏蔽全站前,务必确认不是误操作
  • 重要资源(CSS/JS/图片)不要被误屏蔽,否则影响渲染与收录
  • Allow 用于在屏蔽目录中精准放行,注意路径越具体优先级越高
  • 用 $ 锚定精确后缀(如 *.pdf$),避免前缀误伤
  • 目录屏蔽带尾斜杠(/tmp/ 而非 /tmp)
  • 顶部显式声明 Sitemap,且使用绝对 URL
  • 记录之间用空行分隔,关键分组写注释说明用途
  • 对 AI 爬虫策略(屏蔽或放行)明确表态
  • 上线后用 GSC / 站长工具 验证规则命中是否符合预期
  • 每隔一段时间复查:废弃目录是否已移除、UA 是否已更新

十一、常见错误与避坑

  • 错误 1:想屏蔽全站,却删除/留空了 robots.txt 结果返回 404,爬虫视为”允许全部”。正确做法是写入 User-agent: * + Disallow: /。
  • 错误 2:用 robots.txt 保护隐私数据 它拦不住恶意爬虫,敏感目录必须靠权限认证。
  • 错误 3:把 noindex 写成 robots.txt 指令 Noindex: 不是标准指令,主流引擎会忽略。要阻止收录,请用 meta 标签或 X-Robots-Tag。
  • 错误 4:路径前缀误伤 Disallow: /tmp 会一并屏蔽 /tmpfile、/tmp-2。应写 Disallow: /tmp/。
  • 错误 5:屏蔽了 CSS/JS Google 需渲染页面才能评估,屏蔽关键静态资源会导致收录质量下降。
  • 错误 6:误解 Allow 优先级 Allow 确实优先于同长度的 Disallow,但更长的 Disallow 依然胜出——优先级先看”路径长度”。
  • 错误 7:用 Crawl-delay 对 Google 限速 Google 忽略该指令,请改用 Search Console 的抓取速率设置。

十二、FAQ 高频问题

Q1:robots.txt 一定要有吗?

不一定。缺失(返回 404)时爬虫默认抓取全部。但建议配置,以便管理抓取与声明 Sitemap。

Q2:robots.txt 能删除已收录的页面吗?

不能。它只影响”抓取”。要移除已收录页面,需用 noindex 或 Google 的”移除 URL”工具。

Q3:Disallow 和 Allow 到底谁优先?

先比规则路径长度(更长者优先);长度相同则 Allow 优先。因此”具体 Allow 覆盖宽泛 Disallow”。

Q4:子域名、子目录能单独设置吗?

子域名可各自设置;子目录不能,robots.txt 只能位于根目录。

Q5:屏蔽某个 UA,会不会误伤正常用户?

不会。robots.txt 只对爬虫生效,正常访客不受影响。

Q6:robots.txt 支持正则吗?

不支持。只支持 *(任意字符)与 $(结尾锚定)。

Q7:可以有多条 User-agent: * 吗?

语法上不报错,但后一条的行为不确定,建议只写一条兜底记录。

标签:

SEO 爬虫协议