摘要
本文提供 robots.txt 规范的详细说明,并详细介绍了搜索引擎(特别是 Google 搜索引擎)处理 robots.txt 文件的方式。robots.txt 文件可以让你控制搜索引擎抓取工具如何抓取可公开访问的网页,并将其编入索引。
具体变化
2019 年 7 月 1 日,Google 宣布将推动 robots.txt 协议成为一项互联网标准。这些变化都反映在本文档中。
基本定义
- 抓取工具:抓取工具是指抓取网站的服务或代理。一般而言,如果主机提供的内容可通过标准网络浏览器访问,抓取工具会自动周期性地访问该主机的已知网址。如果抓取工具通过各种途径(例如现有已抓取网页上的链接或站点地图文件)发现新网址,也会以相同的方式进行抓取。
- 用户代理:一种用于标识特定抓取工具或一组抓取工具的手段。
- 指令:robots.txt 文件中规定的某个抓取工具或一组抓取工具适用的一系列准则。
- 网址:RFC 1738 中定义的统一资源定位器。
- Google 专用:这些元素针对的是 Google 的 robots.txt 实现,可能与其他各方无关。
适用性
Google 的所有自动抓取工具都遵循本文档中所述的准则。如果代理代表用户访问网址(例如,为了进行翻译、手动订阅的 Feed、恶意软件分析),那么不必遵循这些准则。
文件位置和有效范围
robots.txt 文件必须位于主机的顶级目录中,可通过适当的协议和端口号进行访问。robots.txt 的通用协议都是基于 URI 的协议,而专用于 Google 搜索(例如,用于抓取网站)的协议为 http
和 https
。使用 HTTP 和 HTTPS 协议时,系统使用 HTTP 无条件 GET
请求来抓取 robots.txt 文件。
Google 专用:Google 还接受和遵循 FTP 网站的 robots.txt 文件。基于 FTP 的 robots.txt 文件可以在匿名登录的情况下,通过 FTP 协议访问。
robots.txt 文件中列出的指令只适用于该文件所在的主机、协议和端口号。
和其他网址一样,robots.txt 文件的网址也区分大小写。
有效 robots.txt 网址的示例
示例 1:http://example.com/robots.txt
适用于:
- http://example.com/
- http://example.com/folder/file
不适用于:
- http://other.example.com/
- https://example.com/
- http://example.com:8181/
这属于一般情况。该网址对其他子网域、协议或端口号来说无效;对同一个主机、协议和端口号上的所有子目录中的所有文件有效。
示例 2:http://www.example.com/robots.txt
适用于:
- http://www.example.com/
不适用于:
- http://example.com/
- http://shop.www.example.com/
- http://www.shop.example.com/
子网域上的 robots.txt 只对该子网域有效。
示例 3:http://example.com/folder/robots.txt
上述 robots.txt 文件无效。抓取工具不会检查子目录中是否包含 robots.txt 文件。
示例 4:http://www.müller.eu/robots.txt
适用于:
- http://www.müller.eu/
- http://www.xn–mller-kva.eu/
不适用于:
- http://www.muller.eu/
IDN 等同于其对应的 punycode 版本。另外,请参阅 RFC 3492。
示例 5:ftp://example.com/robots.txt
适用于:
- ftp://example.com/
不适用于:
- http://example.com/
Google 专用:我们会对 FTP 资源使用 robots.txt。
示例 6:http://212.96.82.21/robots.txt
适用于:
- http://212.96.82.21/
不适用于:
- http://example.com/(即使托管在 212.96.82.21 上)
以 IP 地址作为主机名的 robots.txt 只在抓取作为主机名的该 IP 地址时有效。此类 robots.txt 并不会自动对该 IP 地址上托管的所有网站有效,但该文件可能是共享的,在此情况下,该文件也可以在共享主机名下使用。
示例 7:http://example.com:80/robots.txt
适用于:
- http://example.com:80/
- http://example.com/
不适用于:
- http://example.com:81/
标准端口号(HTTP 为 80;HTTPS 为 443;FTP 为 21)等同于其默认的主机名。
示例 8:http://example.com:8181/robots.txt
适用于:
- http://example.com:8181/
不适用于:
- http://example.com/
非标准端口号上的 robots.txt 文件只对通过这些端口号提供的内容有效。
处理 HTTP 结果代码
一般情况下,robots.txt 文件会出现三种不同的抓取结果:
- 全部允许:所有内容都可以抓取。
- 全部禁止:所有内容都不能抓取。
- 有条件地允许:robots.txt 中的指令决定是否可以抓取某些内容。
处理 HTTP 结果代码 | |
---|---|
2xx(成功) | HTTP 结果代码,表示成功的“有条件地允许”抓取结果。 |
3xx(重定向) | Google 会跟踪至少五次重定向(如适用于 HTTP/1.0 的 RFC 1945 所规定),然后便会停止,并将其处理为 404 错误。建议用户不要处理指向禁止网址的 robots.txt 重定向;由于尚未提取任何规则,因此系统会跟踪至少五次重定向,如果找不到 robots.txt,Google 会在处理 robots.txt 时将它视为 404 错误。 对于以返回 2xx 的 HTML 内容为基础的 robots.txt 文件,建议不要处理这类 robots.txt 文件的逻辑重定向(框架、JavaScript 或元刷新型重定向),并在第一个页面的内容中查找适用的规则。 |
4xx(客户端错误) | 系统对所有 4xx 错误都采用同一种处理方式,并且假定不存在有效的 robots.txt 文件。Google 假定不存在任何限制。这表示抓取时“全部允许”。 包括 401“未授权”和 403“禁止访问”HTTP 结果代码。 |
5xx(服务器错误) | 我们将服务器错误视作会导致抓取作业“全部禁止”的临时性错误。 系统会再次尝试发送该请求,直到获得非服务器错误的 HTTP 结果代码。503(服务不可用)错误会导致非常频繁的重试操作。如果 robots.txt 连续 30 天以上无法访问,系统会使用 robots.txt 的最后一个缓存副本。如果没有缓存副本,Google 会假定没有任何抓取限制。 如果要暂停抓取,建议你提供 503 HTTP 结果代码。 Google 的处理方式:如果我们能够确定,某个网站因为配置不正确而在缺少网页时返回 5xx 错误而不是 404 错误,就会将该网站的 5xx 错误作为 404 错误处理。 |
请求不成功或数据不完整 | 对于因 DNS 或网络问题(例如超时、响应无效、重置或断开连接、HTTP 组块错误等)而无法抓取的 robots.txt 文件,系统在处理时会将其视为服务器错误。 |
缓存 | 一般情况下,robots.txt 内容最多可缓存 24 小时,但在无法刷新缓存版本的情况下(例如,出现超时或 5xx 错误时),缓存时间可能会延长。缓存的响应可以由各种不同的抓取工具共享。Google 会根据 max-age Cache-Control HTTP 标头延长或缩短缓存生命周期。 |
关于完整的 HTTP 状态码,请参考 HTTP 状态码参考。
文件格式
文件应该是用 UTF-8 编码的纯文本格式,其中包含由 CR
、CR/LF
或 LF
分隔的多个行。
系统将只考虑有效的行,而忽略其他所有内容。 例如,如果获得的文档为 HTML 网页,系统只会考虑网页中有效的文本行,而忽略其他内容,并且既不显示警告也不报告错误。
如果因为使用某种字符编码而引入了不属于 UTF-8 子集的字符,则可能导致文件内容解析错误。
系统会忽略 robots.txt 文件开头可选的 Unicode BOM(字节顺序标记)。
每个有效行均由一个字段、一个冒号和一个值组成。你可以选择是否使用空格(但建议使用空格,有助于提高可读性)。你可以使用“#”字符在文件中的任何位置添加注释,系统会将所有位于注释开头和行结尾之间的内容视为注释,并且忽略这部分内容。常见格式为 <field>:<value><#optional-comment>
。系统会忽略行开头和结尾的空格。
<field>
元素不区分大小写。<value>
元素可能会区分大小写,具体取决于 <field>
元素。
我们不支持处理存在轻微错误或拼写错误的 <field>
元素,例如,把 “user-agent” 错写成了 “useragent”。
每个抓取工具都可以单独设定文件大小的上限,并忽略超过该上限的内容。Google 目前强制执行的文件大小上限为 500 KiB。 要减小 robots.txt 文件的大小,请将会导致 robots.txt 文件过大的指令整合在一起。例如,将已排除的内容放在一个单独的目录中。
正式语法/定义
这是 Augmented Backus-Naur Form (ABNF) 说明,如 RFC 5234 中所述:
1 | robotstxt = *(group / emptyline) |
行和规则分组
一个或多个 user-agent
行,后跟一个或多个规则。如果出现另一个 user-agent
行或到了文件末尾,就表示组结束。最后一个组可能没有规则,这意味着它暗含的意思是允许所有内容。
示例组:
1 | user-agent: a |
上面指定了四个不同的组:
- “a” 为一组
- “b” 为一组
- “e” 和 “f” 为一组
- “h” 为一组
除最后一个组(组 “h”)外,每个组都有自己的组成员行。最后一个组(组 “h”)为空。注意:您可以选择使用空格和空白行提高可读性。
用户代理的优先顺序
对于某个抓取工具而言,只有一个组是有效的。抓取工具必须查找用户代理最具体且依然匹配的组,从而确定正确的行组。抓取工具会忽略其他所有组。用户代理区分大小写。所有非匹配文本都会被忽略(例如:googlebot/1.2
和 googlebot*
均等同于 googlebot
)。这与 robots.txt 文件中的组顺序无关。
如果为特定用户代理声明多个组,则这些组中适用于该特定用户代理的所有规则会合并成一个组。
示例
示例 1
以下面的 robots.txt 文件为例:
1 | user-agent: googlebot-news |
以下为抓取工具选择相关组的方法:
- Googlebot 新闻:追踪的组是组 1。仅追踪最具体的组,而忽略其他所有组。
- Googlebot(网络):追踪的组是组 3。
- Googlebot 图片:采用的组是组 3。没有具体的 googlebot-images 组,因此将采用更宽泛的组。
- Googlebot 新闻(抓取图片时):追踪的组是组 1。这些图片由 Googlebot 新闻抓取和使用,因此将仅追踪“Googlebot 新闻”组。
- 其他机器人(网页):追踪的组是组 2。
- 其他机器人(新闻):追踪的组是组 2。即使有相关抓取工具的对应条目,也只有在明确匹配时才会有效。
示例 2
以下面的 robots.txt 文件为例:
1 | user-agent: googlebot-news |
下面说明了抓取工具如何合并与特定用户代理相关的组:
1 | user-agent: googlebot-news |
组成员规则
本部分只介绍标准的组成员规则。对于抓取工具,这些规则也称为“指令”。这些指令以 directive: [path]
的形式指定,其中 [path]
可以选择性使用。默认情况下,指定的抓取工具没有抓取限制。没有 [path]
的指令会被忽略。
如果指定了 [path]
值,该路径值将被视作 robots.txt 文件抓取网站的根目录的相对路径(使用相同的协议、端口号、主机和域名)。路径值必须以 /
开头,表示根目录。路径区分大小写。有关详情,请参阅下面的“基于路径值的网址匹配”部分。
disallow
disallow
指令指定相应抓取工具不能访问的路径。如果没有指定路径,该指令将被忽略。
用法:
1 | disallow: [path] |
allow
allow
指令指定相应抓取工具可以访问的路径。如果没有指定路径,该指令将被忽略。
用法:
1 | allow: [path] |
基于路径值的网址匹配
以路径值为基础确定某项规则是否适用于网站上的特定网址。不使用通配符时,路径可以用于匹配网址的开头,以及匹配以相同路径开头的任何有效网址的开头。路径中的非 7 位 ASCII 字符可以按照 RFC 3986 作为 UTF-8 字符或百分号转义的 UTF-8 编码字符纳入。
对于路径值,Google、Bing 和其他主流搜索引擎支持有限形式的“通配符”。这些通配符包括:
*
表示任何有效字符的 0 个或多个个案。$
表示网址结束。
路径匹配示例:
路径 | 说明 |
---|---|
/ |
匹配根目录以及任何下级网址 |
/* |
等同于 / ,结尾的通配符会被忽略。 |
/fish |
可以匹配:/fish ,/fish.html ,/fish/salmon.html ,/fishheads ,/fishheads/yummy.html ,/fish.php?id=anything 不匹配: /Fish.asp ,/catfish ,/?id=fish 注意:比对时要区分大小写 |
/fish/* |
等同于 /fish ,结尾的通配符会被忽略。 |
/fish/ |
结尾的斜杠 / 表示此项与此文件夹中的任何内容均匹配。可以匹配: /fish/ ,/animals/fish/ ,/fish/?id=anything ,/fish/salmon.htm 不匹配: /fish ,/fish.html ,/Fish/Salmon.asp |
/*.php$ |
可以匹配:/filename.php ,/folder/filename.php 不匹配: /filename.php?parameters ,/filename.php/ ,/filename.php5 ,/windows.PHP |
/fish*.php |
可以匹配:/fish.php ,/fishheads/catfish.php?parameters 不匹配: /Fish.PHP |
Google 支持的非组成员行
按照 sitemaps.org 的定义,Google、Bing 和其他主流搜索引擎支持 sitemap
。
用法:
1 | sitemap: [absoluteURL] |
[absoluteURL]
行指向站点地图或站点地图索引文件的位置。此网址必须是完全限定网址,包含协议和主机,且无需进行网址编码。网址不需要与 robots.txt 文件位于同一主机上。sitemap
条目可以有多个。作为非组成员行,它们不依赖于任何特定的用户代理,只要未加禁止,所有抓取工具都可以追踪它们。
示例
1 | user-agent: otherbot |
组成员行的优先顺序
在组成员一级,尤其是对于 allow
和 disallow
指令,最具体的规则优先级最高;根据 [path] 条目的长度,长度越短,越不具体。如果规则(包括使用通配符的规则)存在冲突,系统将使用限制性最弱的规则。
示例情况 | |
---|---|
http://example.com/page |
allow : /p disallow : / 认定结果: allow |
http://example.com/folder/page |
allow : /folder disallow : /folder 认定结果: allow |
http://example.com/page.htm |
allow : /page disallow : /*.htm 认定结果: undefined |
http://example.com/ |
allow : /$ disallow : / 认定结果: allow |
http://example.com/page.htm |
allow : /$ disallow : / 认定结果: disallow |
测试 robots.txt 标记
可以使用 robots.txt 测试工具来测试针对指定的搜索引擎,是否允许访问指定的页面(路径)。