直接答案:这是一个只在浏览器本地运行的 robots.txt 判定器。粘贴一段 robots.txt、填一个路径,它会按 RFC 9309 的“先选最具体的 User-agent 组、再取最长路径规则”分别判定 GPTBot、OAI-SearchBot、PerplexityBot、Bytespider、ClaudeBot 是放行还是屏蔽,并指出是哪一行规则生效。它不联网、不抓你的站,也不能证明 AI 会引用你。
做这个工具的原因是验收现场的一句话:“我们已经允许 AI 了。”这句话无法验证:同一份文件对不同 bot 可以给出相反结论;`Allow` 不一定优先;没有 robots.txt 也不是“明确放行”。把这三件事变成逐行可复核的判定,比多写一段解释有用。
1. 先定组:User-agent 与爬虫名前缀匹配,最长者胜,没有才用 *。
2. 再定规则:命中的路径最长者胜,等长时 Allow 胜。
3. 什么都不命中 = 允许;整个文件不存在 = absent,不等于“明确放行”。
工具:粘贴 → 输入路径 → 看五个 bot
正在计算…
| 爬虫 | 判定 | 命中的组 | 生效规则 | 行号 |
|---|
说明:判定只针对上面这一个路径;同一站点不同路径、不同 bot 可以完全不同。
把示例里的路径换成 /download/public/manual.pdf,会看到 * 组从“不允许”变成“允许”:命中的是更长的 Allow: /download/public/。再把 UA 换成 GPTBot/1.2,结论会重新变成不允许——因为它的专属组把整站挡掉了,而专属组优先于 *。
判定是怎么算出来的
| 步骤 | 规则 | 容易搞错的地方 |
|---|---|---|
| 1 选组 | 把爬虫名(如 GPTBot/1.2)取出 product token,与每个 User-agent 值做大小写不敏感的前缀匹配,取最长的那个组;没有具体组才用 * | “写了 * 就管所有 bot”只在没有更具体组时成立;GPTBot 组对 ClaudeBot 无效 |
| 2 选规则 | 在该组内找命中路径的 Allow/Disallow,路径最长者胜;长度相同时 Allow 胜 | 不是“后写的覆盖先写的”,也不是“Allow 一定优先” |
| 3 无命中 | 该组没有规则命中 → 允许 | “只有 Allow 行”不会顺带屏蔽其他路径 |
| 4 无组 | 没有具体组也没有 * → 不限制 | 与“有 * 且全允许”在结果上一样,但证据不同 |
| 5 空值 | Disallow: 空值 → 不限制;整份文件为空 → absent | 空值规则常被误当成“全部禁止” |
通配符:* 匹配任意字符序列;行尾 $ 表示路径必须在此结束。所以 /*.php$ 不会命中 /a.php?x=1。
五种常见写法的实际含义
| 写法 | 实际含义 | 验收时该记什么 |
|---|---|---|
User-agent: *Allow: / | 对所有未单独声明的爬虫不设限 | allowed(通配) |
User-agent: *Disallow: / | 所有未单独声明的爬虫全站不可抓 | disallowed(通配) |
Disallow: /admin/Allow: /admin/public | 后台整体屏蔽,只放行指定子路径 | 按路径分别判定,别只测首页 |
User-agent: GPTBotDisallow: / | 只挡 GPTBot,其余走 * 或默认 | 写清 bot 名与结论,不写“已允许 AI” |
| 没有 robots.txt | 没有声明;通行做法视为不限制 | absent,并确认是有意还是遗漏 |
为什么这件事值得逐行核
在我们 2026 年 11 月的 30 家装备制造企业官网扫描 中,25 个可判定首页里,17 个对五个 bot 全部放行、1 个全部屏蔽、7 个没有 robots.txt;另有 4 个首页未能识别、1 个 robots.txt 返回 502。样本不是随机抽样,不能外推行业总体,但它说明一件事:“有 robots.txt”与“政策清楚”不是一回事,而 absent 和 disallowed 在验收表里必须分开记。
同一批站点里,还出现过“首页放行、产品路径全屏蔽”的情况(见 15 个产品入口页 pilot)。只测首页会把这种差异整个漏掉。把路径作为必填项,是这个工具刻意做的取舍。
五个常见坑
- 以为 Allow 能“打开”别的 bot。
Allow只在本组内与Disallow比长度;它不会让一个被专属组挡住的 bot 重新进来。 - 以为顺序决定结果。 规则按路径长度比较,不按出现顺序。把
Allow挪到前面不会改变结论。 - 把 sitemap 当规则。
Sitemap只是指路,不参与放行判定;删掉它不会“解开屏蔽”。 - 把 absent 写成 allow。 没有文件时抓取侧通常按不限制处理,但这是默认值,不是站点的明示许可。
- 忘了查询串和
$。 带参数的 URL 与不带参数的是不同路径;$的有无会改变命中结果。
边界与局限
- 不抓站:工具只处理你粘贴的文本,不会去取线上 robots.txt;要验证线上状态,仍需自行抓取并保留时间、UA 与原文。
- 不是爬虫:它按 RFC 9309 的文本规则判定,不模拟各厂商的完整实现细节(例如某些产品的额外 UA 别名)。
- 不做编码归一:路径与规则按字面比较;
%20与空格视为不同。RFC 要求双方都先做百分号编码,实际站点多数也是一致写法。 - 不预测引用:放行只表示“允许抓取”,是否入库、是否被引用由各产品策略决定,本工具不作承诺。
- 不替代验收:条款、证据与复测范围见 12 条验收条款模板;逐项打分见 20 项自测表。
测试与复算
匹配逻辑在 js/robots-matcher.js,无依赖、不联网;scripts/test_robots_matcher.js 覆盖 30 组断言,包括组选择、最长匹配、等长时 Allow 优先、* 与 $、空值规则、BOM/CRLF、重复 * 组合并、路径大小写与编码差异。运行方式:
node scripts/test_robots_matcher.js
页面上的判定与测试调用的是同一份函数,不存在“文章里一套、工具里一套”的分叉。
数据来源与口径
- RFC 9309《Robots Exclusion Protocol》,第 2.2 节群组与规则匹配:rfc-editor.org。
- Google Search Central《How Google interprets the robots.txt specification》:developers.google.com。
- 本工具引用的样本观察:30 家装备企业官网 AI 爬虫政策扫描;15 个产品入口页 pilot。