使用指南发布日期 阅读时间约 8 分钟

robots.txt 中 Allow 与 Disallow 的优先顺序:* 和 $ 的含义

在 robots.txt 中,同一个网址同时符合 Allow 和 Disallow 时,到底用哪一条?很多人以为“写在上面的优先”,但 Google 的读法并不是这样。本文用实例说明 Google 采用的“匹配最长的规则胜出”机制、通配符“*”和末尾“$”的含义、“/fish”与“/fish/”的区别,以及大小写和非 ASCII 网址的处理方式。

基本规则:匹配最长的规则胜出

Google 会收集所有与网址路径匹配的 Allow 和 Disallow,从中使用模式字符数最多的那条规则。思路是模式越长,指示越“具体”。与书写顺序无关。这种读法也写进了 robots.txt 的标准规范(RFC 9309)。

robots.txt网址结果原因
Disallow: /blog/ / Allow: /blog/public//blog/public/a.html允许Allow(13个字符)比 Disallow(6个字符)长
Disallow: /blog/ / Allow: /blog/public//blog/secret.html屏蔽匹配的只有 Disallow: /blog/
Allow: /blog/ / Disallow: /blog/private//blog/private/x屏蔽Disallow 更长。即使上面有 Allow 也没关系
Disallow: / / Allow: /$/允许/$ 比 / 长($ 也算1个字符)
Disallow: / / Allow: /$/about屏蔽/$ 只匹配首页

另外,Bing 的读法也大致相同,但有些旧的爬虫和部分工具会“从上往下读,使用第一条匹配的规则”。如果希望所有爬虫得到相同结果,把 Allow 写在 Disallow 上面比较安全。

路径是前缀匹配:“/fish”与“/fish/”的区别

Allow、Disallow 中写的路径,是从网址开头开始比较(前缀匹配)。因此末尾有没有斜杠,屏蔽的范围会大不相同。

模式匹配的例子不匹配的例子
/fish/fish、/fish.html、/fish/salmon.html、/fishheads/Fish.asp、/catfish、/?id=fish
/fish//fish/、/fish/salmon.html、/fish/?id=1/fish、/fish.html、/Fish/Salmon.asp
/网站的所有网址—
(空)什么都不匹配(只写 Disallow: 则全部允许)—

写成“Disallow: /admin”的话,除了 /admin/,连 /administrator 和 /admin-guide.html 也会被屏蔽。如果只想屏蔽文件夹里面的内容,就在末尾加斜杠写成“Disallow: /admin/”。WordPress 默认的“Disallow: /wp-admin/”不会屏蔽 /wp-admin-guide/,也是这个区别造成的。

“*”和“$”的含义与用法

Google 和 Bing 会特殊处理模式中的2个符号。“*”匹配0个以上的任意字符串,“$”只有放在模式末尾时才表示“网址的结尾”。

模式含义匹配不匹配
/*.php中间含有 .php/index.php、/a.php?x=1、/a.php5/windows.PHP
/*.php$以 .php 结尾/index.php、/dir/a.php/a.php?x=1、/a.php5
/*.pdf$以 .pdf 结尾/files/manual.pdf/files/manual.pdf?download=1
/*?带查询参数(?)/?a=1、/items?color=red/items
/*?*sort=查询参数中含有 sort=/items?color=red&sort=price/items?color=red
/fish*与 /fish 相同(末尾的 * 没有意义)/fish、/fishheads/catfish
  • “$”只有放在最后时才有特殊含义。像“/a$b”这样放在中间的 $,会被当作普通字符。
  • “**”与1个“*”相同。
  • User-agent 的名称不能像“*bot”这样使用通配符。能用“*”的只有“User-agent: *”这一种写法。
  • 模式以“/”或“*”开头。如果像“Disallow: private/”这样忘了写 /,就不会匹配任何网址。

把搜索结果、带参数的网址排除在抓取之外的例子

站内搜索结果,以及带排序、筛选参数的网址,组合起来几乎可以无限增加。为了减少抓取浪费,经常会在 robots.txt 中把它们排除。

  1. 1

    Disallow: /search

    屏蔽 /search 和 /search?q=鞋。注意因为是前缀匹配,/search-tips 这样的网址也会被屏蔽。

  2. 2

    Disallow: /*?s=

    屏蔽 WordPress 的站内搜索(/?s=关键词、/blog/?s=…)。

  3. 3

    Disallow: /*?*sort=

    屏蔽查询参数中任意位置含有 sort= 的网址。不屏蔽 /items?color=red,但屏蔽 /items?color=red&sort=price。

  4. 4

    Allow: /search/help

    在 /search 的屏蔽范围内,只允许帮助页面。因为 Allow 更长,无论书写顺序如何都是允许。

有些写法在参数顺序改变后就不再匹配,所以比起“/*?sort=”,像“/*?*sort=”这样在中间加上 *,可以减少遗漏。请列出几种实际的网址,用测试工具确认结果后再发布。

大小写与非 ASCII 网址的处理

  • 路径区分大小写。“Disallow: /Admin/”不会屏蔽 /admin/。在网址中混有大写字母的 CMS 中,要么两种都写,要么按实际网址来写。
  • User-agent 的名称不区分大小写。“googlebot”和“Googlebot”是一样的。
  • 对于中文等非 ASCII 路径,无论是像“Disallow: /商品/”这样直接写,还是像“Disallow: /%E5%95%86%E5%93%81/”这样进行百分号编码,Google 都视为相同。文件要以 UTF-8 保存。
  • 百分号编码中的英文字母(%E5 与 %e5)不区分大小写。

robots.txt 测试工具也和 Google 一样,把非 ASCII 路径和百分号编码当作同一个网址来比较。用实际网址试一试,确认两种写法结果相同,会比较放心。分组的选择方式请参考User-agent 的写法与分组的选择方式,写了却不生效的原因请参考robots.txt 的确认方法。

常见问题

robots.txt 中写在上面的规则优先吗?
在 Google 中与书写顺序无关。在匹配的规则中使用模式最长的那条,长度相同则使用 Allow。如果也想兼顾从上往下读的爬虫,先写 Allow 比较安全。
robots.txt 中的 $ 是什么意思?
放在模式末尾的“$”表示“网址的结尾”。“Disallow: /*.pdf$”只屏蔽以 .pdf 结尾的网址,不屏蔽像 /a.pdf?download=1 这样后面接着查询参数的网址。
Disallow: /admin 和 Disallow: /admin/ 不一样吗?
不一样。“/admin”是前缀匹配,所以 /administrator 和 /admin.html 也会被屏蔽。“/admin/”只屏蔽文件夹里面的内容,不屏蔽 /admin(无斜杠)。
同时写 Allow: / 和 Disallow: / 会怎样?
两者的模式长度都是1个字符,相同,所以 Google 使用 Allow,结果是全部允许。如果想屏蔽整个网站,请删除 Allow: /。

本文介绍的工具

相关文章

使用指南约 8 分钟

robots.txt 的检查方法:测试工具下线后检查屏蔽情况的步骤

Google Search Console 里的 robots.txt 测试工具已于 2023 年 12 月停止提供,现在换成了“robots.txt 报告”。报告无法“输入网址测试是否被屏蔽”,因此很多人不知道该去哪里检查。本文整理 robots.txt 的存放位置和打开方法、Search Console 报告和网址检查工具能看出与看不出的内容、用测试工具逐个网址确认判定的步骤,以及修改后到生效的过程。

阅读文章 →
使用指南约 7 分钟

robots.txt 中 User-agent 的写法:同时写 * 和 Googlebot 会怎样

如果 robots.txt 里同时有“User-agent: *”组和“User-agent: Googlebot”组,Googlebot 就不再使用“*”下的规则。很多人不知道这一点,加了 Googlebot 专用的组之后,原本屏蔽的网页反而被抓取了。本文说明爬虫如何决定使用哪一组、Googlebot-Image 和 AdsBot-Google 等的特殊处理,以及组的合并方法和容易写错的地方。

阅读文章 →
使用指南约 8 分钟

用 robots.txt 屏蔽 AI 爬虫:GPTBot、ClaudeBot 等

越来越多的站长不希望自己网站的文字和图片被拿去训练 AI。只要在 robots.txt 中写上 AI 爬虫的名称,就能要求各公司的爬虫停止抓取。不过 AI 爬虫分为“训练用”“AI 搜索用”“按用户指令访问”三类,屏蔽哪一类,影响差别很大。本文整理主要 AI 爬虫的名称与用途、按目的划分的 robots.txt 写法,以及屏蔽时的注意事项。

阅读文章 →