robots.txt 的匹配不是「先写先赢」,而是最长模式优先(模式越长越具体);长度相同时 Allow 优先于 Disallow。这个顺序踩过一次坑就会记一辈子。
-
规则组数
-
生效组规则数
-
匹配规则数
-
判定结果
| 规则 | 类型 | 所属组 | 是否匹配 |
|---|
匹配规则:把模式中的 * 视为通配符、结尾 $ 视为锚点,其余字符按字面量前缀匹配。在所有命中的规则中取模式最长的一条;若长度相同则 Allow 胜出。没有任何规则命中时默认允许抓取。
robots.txt 的判定规则
很多人以为 robots.txt 是从上往下第一条命中就生效。实际上主流搜索引擎(以 Google 为准)遵循两条更精确的规则:
- 最长匹配优先:在全部命中的规则中,选模式字符串最长的那条。越长代表越具体。
- 同级 Allow 优先:长度相同时,Allow 覆盖 Disallow。
正是第 2 条让下面这种写法能够生效——先禁整个目录,再单独放行其中一个子目录:
User-agent: *
Disallow: /admin/
Allow: /admin/public/
Disallow: /admin/
Allow: /admin/public/
访问 /admin/secret 会命中 /admin/(禁止),而 /admin/public/doc.html 同时命中 /admin/ 和 /admin/public/——后者更长,所以允许。如果换成先写 Allow 再写 Disallow,结果完全一样,因为顺序不影响判定。
User-Agent 组怎么选
robots.txt 可以按爬虫分组。判定时先找与访问者 UA 最匹配的组:
- 有专门针对该爬虫的组(如
User-agent: Googlebot),就用这个组,完全忽略*组。 - 没有专门匹配的组,才回落到
User-agent: *组。 - 两个组都不存在时,默认允许抓取全部内容。
这是第二个常见坑:给某个爬虫单独写了组,就等于把它从 * 组里摘了出去。如果不小心写了一个空的 User-agent: Googlebot 组,Googlebot 反而会变得「什么都能抓」。
通配符与锚点
| 写法 | 含义 | 示例 |
|---|---|---|
* | 匹配任意字符序列 | Disallow: /*.pdf$ |
$ | 锚定结尾 | Disallow: /*.json$ 只禁以 .json 结尾的 |
/ | 根路径,等于禁止整站 | Disallow: / |
| 空值 | 表示不做任何限制 | Disallow: |
另外请注意:robots.txt 是君子协定,只约束守规矩的爬虫,无法阻止恶意抓取。需要真正防护的页面,请用登录鉴权或服务端访问控制;robots.txt 的作用是防止正常搜索引擎误抓,同时避免无意义的抓取浪费带宽。
你可能还想问
规则匹配是怎么判定的?
按代理标识分组匹配,路径前缀越长越具体、优先级越高;通配与结尾符的语义要按规范理解,不同爬虫实现略有差异。
屏蔽了为什么还会被抓?
该文件只是约定、不具强制力;恶意爬虫会无视它,真正限制访问要靠服务端鉴权、限流与来源策略。
怎么写更稳妥?
只屏蔽必要路径、给出明确的站点地图地址、测试无误再上线;大范围屏蔽容易误伤,导致重要页面不被收录。
速查在线工具箱