Robots.txt 规范

摘要

本文档详细介绍了 Google 处理 robots.txt 文件的方式,这种文件让您可以控制 Google 的网站抓取工具如何抓取可公开访问的网站并将其编入索引。

具体变化

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 网址示例
http://example.com/robots.txt 适用于:
  • http://example.com/
  • http://example.com/folder/file
不适用于:
  • http://other.example.com/
  • https://example.com/
  • http://example.com:8181/
http://www.example.com/robots.txt

适用于http://www.example.com/

不适用于:

  • http://example.com/
  • http://shop.www.example.com/
  • http://www.shop.example.com/
http://example.com/folder/robots.txt robots.txt 文件无效。抓取工具不会检查子目录中是否包含 robots.txt 文件。
http://www.müller.eu/robots.txt 适用于:
  • http://www.müller.eu/
  • http://www.xn--mller-kva.eu/

不适用于:http://www.muller.eu/

ftp://example.com/robots.txt

适用于ftp://example.com/

不适用于:http://example.com/

Google 专用:我们会对 FTP 资源使用 robots.txt。

http://212.96.82.21/robots.txt

适用于http://212.96.82.21/

不适用于http://example.com/(即使托管在 212.96.82.21 上)

http://example.com:80/robots.txt

适用于:

  • http://example.com:80/
  • http://example.com/

不适用于:http://example.com:81/

http://example.com:8181/robots.txt

适用于http://example.com:8181/

不适用于:http://example.com/

处理 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 假定不存在任何限制。这表示抓取时“全部允许”。
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 标头延长或缩短缓存生命周期。

文件格式

文件应该是用 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 文件过大的指令整合在一起。例如,将已排除的内容放在一个单独的目录中。

正式语法/定义

以下是 RFC 5234 中所述的 Augmented Backus-Naur Form (ABNF) 说明

robotstxt = *(group / emptyline)
group = startgroupline                    ; We start with a user-agent
        *(startgroupline / emptyline)     ; ... and possibly more user-agents
        *(rule / emptyline)               ; followed by rules relevant for UAs

startgroupline = *WS "user-agent" *WS ":" *WS product-token EOL

rule = *WS ("allow" / "disallow") *WS ":" *WS (path-pattern / empty-pattern) EOL

; parser implementors: add additional lines you need (for example, Sitemaps), and
; be lenient when reading lines that don’t conform. Apply Postel’s law.

product-token = identifier / "*"
path-pattern = "/" *(UTF8-char-noctl)    ; valid URI path pattern; see 3.2.2
empty-pattern = *WS

identifier = 1*(%x2d / %x41-5a / %x5f / %x61-7a)
comment = "#" *(UTF8-char-noctl / WS / "#")
emptyline = EOL
EOL = *WS [comment] NL         ; end-of-line may have optional trailing comment
NL = %x0D / %x0A / %x0D.0A
WS = %x20 / %x09

; UTF8 derived from RFC3629, but excluding control characters
UTF8-char-noctl = UTF8-1-noctl / UTF8-2 / UTF8-3 / UTF8-4
UTF8-1-noctl    = %x21 / %x22 / %x24-7F  ; excluding control, space, '#'
UTF8-2          = %xC2-DF UTF8-tail
UTF8-3          = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
                  %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
UTF8-4          = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
                  %xF4 %x80-8F 2( UTF8-tail )
UTF8-tail       = %x80-BF

行和规则分组

一个或多个用户代理行,后跟一个或多个规则。如果出现另一个用户代理行或到了文件末尾,即表示组结束。最后一个组可能没有规则,这意味着它暗含的意思是允许所有内容。

示例组:

user-agent: a
disallow: /c

user-agent: b
disallow: /d

user-agent: e
user-agent: f
disallow: /g

user-agent: h

上面指定了四个不同的组:

  • “a”为一组
  • “b”为一组
  • “e”和“f”为一组
  • “h”为一组

除最后一个组(组“h”)外,每个组都有自己的组成员行。最后一个组(组“h”)为空。注意:您可以选择使用空格和空白行提高可读性。

用户代理的优先顺序

对于某个抓取工具而言,只有一个组是有效的。 抓取工具必须查找最具体的匹配用户代理,从而确定正确的行组。抓取工具会忽略其他所有组。用户代理区分大小写。所有非匹配文本都会被忽略(例如,googlebot/1.2googlebot* 均等同于 googlebot)。这与 robots.txt 文件中的组顺序无关。

如果特定用户代理有多个组,则这些组中适用于特定用户代理的所有规则会合并在一起。

示例

以下面的 robots.txt 文件为例:

user-agent: googlebot-news
(group 1)

user-agent: *
(group 2)

user-agent: googlebot
(group 3)

以下为抓取工具选择相关组的方法:

每个抓取工具追踪的组
Googlebot 新闻 追踪的组是组 1。仅追踪最具体的组,而忽略其他所有组。
Googlebot(网络) 追踪的组是组 3。
Googlebot 图片 追踪的组是组 3。没有具体的 googlebot-images 组,因此将追踪更宽泛的组。
Googlebot 新闻(抓取图片时) 追踪的组是组 1。这些图片由“Googlebot 新闻”抓取和使用,因此将仅追踪“Googlebot 新闻”组。
其他机器人(网络) 追踪的组是组 2。
其他机器人(新闻) 追踪的组是组 2。即使有相关抓取工具的对应条目,也只有在明确匹配时才会抓取。

另请参阅 Google 的抓取工具和用户代理字符串

组成员规则

本部分仅说明标准的组成员规则。对于抓取工具,这些规则也称为“指令”。这些指令以 directive: [path] 的形式指定,其中 [path] 可选。默认情况下,指定的抓取工具没有抓取限制。没有 [path] 的指令会被忽略。

如果指定了 [path] 值,该路径值将被视作 robots.txt 文件抓取网站的根目录的相对路径(使用相同的协议、端口号、主机和域名)。路径值必须以“/”开头,表示根目录。路径区分大小写。有关详情,请参阅下面的“基于路径值的网址匹配”部分。

disallow

disallow 指令指定相应抓取工具不能访问的路径。如果未指定路径,该指令将被忽略。

用法:

disallow: [path]

allow

allow 指令指定相应抓取工具可以访问的路径。如果未指定路径,该指令将被忽略。

用法:

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.html
  • /fish/salmon.html
  • /fishheads
  • /fishheads/yummy.html
  • /fish.php?id=anything

不匹配项:

  • /Fish.asp
  • /catfish
  • /?id=fish
/fish/

结尾的斜杠表示此项与此文件夹中的任何内容均匹配。

匹配项:

  • /fish/
  • /fish/?id=anything
  • /fish/salmon.htm

不匹配项:

  • /fish
  • /fish.html
  • /Fish/Salmon.asp
/*.php

匹配项:

  • /filename.php
  • /folder/filename.php
  • /folder/filename.php?parameters
  • /folder/any.php.file.html
  • /filename.php/

不匹配项:

  • /(即使其映射到 /index.php)
  • /windows.PHP
/*.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 支持的非组成员行

Google、Bing 和其他主流搜索引擎支持 sitemap(如 sitemaps.org 所定义)。

用法:

sitemap: [absoluteURL]

[absoluteURL] 指向站点地图、站点地图索引文件或等效网址。 网址不需要与 robots.txt 文件位于同一主机上。 sitemap 条目可以有多个。作为非组成员行,它们不依赖于任何特定的用户代理,只要未加禁止,所有抓取工具都可以追踪它们。

组成员行的优先顺序

在组成员一级,尤其是对于 allowdisallow 指令,最具体的规则优先级最高;根据 [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 标记

Google 提供了两种测试 robots.txt 标记的选项:

  1. Search Console 中的 robots.txt 测试工具
  2. Google 的开源 robots.txt 库(也用在 Google 搜索中)。