Robots.txt 规范中文版

关于 robots.txt 你需要知道的都在这里

本文由 墨然 发布于 2021-06-01

摘要

本文提供 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 搜索(例如,用于抓取网站)的协议为 httphttps。使用 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 编码的纯文本格式,其中包含由 CRCR/LFLF 分隔的多个行。

系统将只考虑有效的行,而忽略其他所有内容。 例如,如果获得的文档为 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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 行,后跟一个或多个规则。如果出现另一个 user-agent 行或到了文件末尾,就表示组结束。最后一个组可能没有规则,这意味着它暗含的意思是允许所有内容。

示例组:

1
2
3
4
5
6
7
8
9
10
11
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 文件中的组顺序无关。

如果为特定用户代理声明多个组,则这些组中适用于该特定用户代理的所有规则会合并成一个组。

示例

示例 1

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

1
2
3
4
5
6
7
8
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。即使有相关抓取工具的对应条目,也只有在明确匹配时才会有效。

示例 2

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

1
2
3
4
5
6
7
8
user-agent: googlebot-news
disallow: /fish

user-agent: *
disallow: /carrots

user-agent: googlebot-news
disallow: /shrimp

下面说明了抓取工具如何合并与特定用户代理相关的组:

1
2
3
4
5
6
user-agent: googlebot-news
disallow: /fish
disallow: /shrimp

user-agent: *
disallow: /carrots

组成员规则

本部分只介绍标准的组成员规则。对于抓取工具,这些规则也称为“指令”。这些指令以 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
2
3
4
5
6
user-agent: otherbot
disallow: /kale

sitemap: https://example.com/sitemap.xml
sitemap: https://cdn.example.org/other-sitemap.xml
sitemap: https://ja.example.org/テスト-サイトマップ.xml

组成员行的优先顺序

在组成员一级,尤其是对于 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 标记

可以使用 robots.txt 测试工具来测试针对指定的搜索引擎,是否允许访问指定的页面(路径)。


更多精彩文章