robots.txt 规范

摘要

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

要求用语

本文档中的以下关键字均需按照 RFC 2119 中的说明进行解读:“必须”、“不得”、“必需”、“会”、“不会”、“应”、“不应”、“建议”、“可以”和“可选”。

基本定义

定义
抓取工具 抓取工具是用于抓取网站的服务或代理。一般而言,对于发布的内容可通过标准网络浏览器访问的主机,抓取工具会自动以递归方式访问其中的已知网址。如果抓取工具发现新网址(通过各种途径,例如通过现有的已抓取网页上的链接,或通过站点地图文件),也会以相同的方式抓取这些网址。
用户代理 一种用于标识特定抓取工具或一组抓取工具的手段。
指令 robots.txt 文件中规定的某个抓取工具或一组抓取工具适用的一系列准则。
网址 RFC 1738 中定义的统一资源定位器。
Google 专用 这些元素针对的是 Google 的 robots.txt 实现,可能与其他各方无关。

适用性

Google 的所有自动抓取工具均遵循本文档中所述的准则。代理代表用户访问网址时(例如,为了获取翻译、手动订阅的 Feed、恶意软件分析数据等),则无需遵循这些准则。

文件的位置和适用范围

robots.txt 文件必须位于主机的顶级目录中,可通过适当的协议和端口号进行访问。robots.txt(以及用于抓取网站)的通用协议为“http”和“https”。在 http 和 https 上,robots.txt 文件是使用 HTTP 无条件 GET 请求抓取的。

Google 专用:Google 同样接受和遵循 FTP 网站的 robots.txt 文件。用户匿名登录后,可通过 FTP 协议访问基于 FTP 的 robots.txt 文件。

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(重定向) 一般情况下,在发现有效的结果(或识别出存在循环)之前,系统会跟踪重定向。我们会跟踪有限次数的重定向(适用于 HTTP/1.0 的 RFC 1945 最多允许 5 次重定向),然后便会停止,并将其作为 404 错误进行处理。我们并未定义如何处理指向禁止网址的 robots.txt 重定向,并且不建议这么做。同样,我们也未定义如何根据返回 2xx 的 HTML 内容处理 robots.txt 文件的逻辑重定向(框架、JavaScript 或元刷新型重定向),并且不建议这么做。
4xx(客户端错误) Google 会以同样的方式处理所有 4xx 错误,并会假定不存在有效的 robots.txt 文件,这相当于假定不存在任何限制,同时抓取时采用“全部允许”。
5xx(服务器错误)

服务器错误会被视为临时性错误,能够导致“全部禁止”抓取。系统会再次尝试发送请求,直到获得代表非服务器错误的 HTTP 结果代码。503(服务不可用)错误会导致非常频繁的重试操作。要暂停抓取,我们建议使用 503 HTTP 结果代码。我们并未定义如何处理永久性的服务器错误。

Google 专用:如果我们能够确定某个网站因配置不正确而导致针对缺少网页的情况返回 5xx 错误而非 404 错误,那么我们会将针对该网站的 5xx 错误视为 404 错误。

请求未成功或数据不完整 我们未定义如何处理因 DNS 或网络问题(例如超时、响应无效、重置/连接断开、HTTP 分块错误等)而无法抓取的 robots.txt 文件。
缓存 一般情况下,robots.txt 请求最多可缓存一天,但在无法刷新缓存版本的情况下(例如,出现超时或 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 KB。

正式语法/定义

下面是一段 Backus-Naur Form (BNF) 形式的说明,采用的是 RFC 822 惯例,但使用“|”指定可选项。文本使用 "" 进行引用,圆括号“(”和“)”用于对元素进行分组,可选元素包含在方括号 ([]) 中,也可在前面添加 <n>*,以便将以下元素的重复次数指定为 n 或更多,其中 n 默认为 0。

robotstxt = *entries
entries = *( ( <1>*startgroupline
  *(groupmemberline | nongroupline | comment)
  | nongroupline
  | comment) )
startgroupline = [LWS] "user-agent" [LWS] ":" [LWS] agentvalue [comment] EOL
groupmemberline = [LWS] (
  pathmemberfield [LWS] ":" [LWS] pathvalue
  | othermemberfield [LWS] ":" [LWS] textvalue) [comment] EOL
nongroupline = [LWS] (
  urlnongroupfield [LWS] ":" [LWS] urlvalue
  | othernongroupfield [LWS] ":" [LWS] textvalue) [comment] EOL
comment = [LWS] "#" *anychar
agentvalue = textvalue

pathmemberfield = "disallow" | "allow"
othermemberfield = ()
urlnongroupfield = "sitemap"
othernongroupfield = ()

pathvalue = "/" path
urlvalue = absoluteURI
textvalue = *(valuechar | SP)
valuechar = <any UTF-8 character except ("#" CTL)>
anychar = <any UTF-8 character except CTL>
EOL = CR | LF | (CR LF)

RFC 1945 中定义了“absoluteURI”、“CTL”、“CR”、“LF”、“LWS”的语法。RFC 1808 中定义了“path”的语法。

记录分组

系统根据 <field> 元素的类型将记录分为以下几种类型:

  • 组起始
  • 组成员
  • 非组内容

一个组起始记录与下一个组起始记录之间的所有组成员记录被视为一个记录组。唯一的组起始字段元素为 user-agent。在最后一个组起始行之后的组成员记录后面,是依次相连的多个组起始行。如果任何组成员记录之前没有组起始记录,则会被忽略。所有非组内容记录均有效,与所有组共存。

以下为有效的 <field> 元素,本文稍后会分别对其进行详细说明:

  • user-agent(组起始)
  • disallow(仅在作为组成员记录时有效)
  • allow(仅在作为组成员记录时有效)
  • sitemap(非组内容记录)

所有其他 <field> 元素可能会被忽略。

组起始元素 user-agent 用于指定组对其有效的抓取工具 for which crawler the group is valid. 一个组记录仅对一种特定的抓取工具有效。我们将在本文档的后面部分中介绍优先顺序。

示例组:

user-agent: a
disallow: /c

user-agent: b
disallow: /d

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

该示例中指定了三个不同的组,一个针对“a”,一个针对“b”,还有一个同时针对“e”和“f”。每个组都有各自的组成员记录。注意:您可以选择使用空格(空白行),以提高可读性。

用户代理的优先顺序

对于特定的抓取工具,只有一个组成员记录组有效。抓取工具必须通过最具体的匹配用户代理进行查找,从而确定正确的记录组。抓取工具会忽略其他所有记录组。用户代理不区分大小写。所有非匹配文本都会被忽略(例如,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 的抓取工具和用户代理字符串

组成员记录

本部分仅说明常规组成员记录类型以及 Google 专用的组成员记录类型。对于抓取工具,这些记录类型也称为“指令”。这些指令以 directive: [path] 的形式指定,其中 [path] 为可选项。默认情况下,对于指定的抓取工具,没有抓取限制。没有 [path] 的指令将被忽略。

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

disallow

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

用法:

disallow: [path]

allow

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

用法:

allow: [path]

根据路径值进行网址匹配

路径值用作确定网站上特定网址是否符合规则的基准。不使用通配符时,路径可用于匹配网址的开头(以及以相同路径开头的任何有效网址)。路径中的非 7 位 ASCII 字符可以作为 UTF-8 字符添加,也可以按照 RFC 3986 作为百分号转义的 UTF-8 编码字符添加。

对于路径值,Google、Bing、Yahoo 和 Ask 支持有限形式的“通配符”。这些通配符包括:

  • * 代表任何有效字符的 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 支持的非组成员记录

sitemap

受 Google、Ask、Bing、Yahoo 支持;在 sitemaps.org 上定义。

用法:

sitemap: [absoluteURL]

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

组成员记录的优先顺序

在组成员一级,尤其是对于 allowdisallow 指令,最具体的规则(根据 [path] 条目的长度,长度越短,越不具体)优先级最高。对于使用通配符的规则,其优先顺序未定义。

示例情况
http://example.com/page

Allow: /p

Disallow: /

Verdict: allow

http://example.com/folder/page

Allow: /folder

Disallow: /folder

Verdict: allow

http://example.com/page.htm

Allow: /page

Disallow: /*.htm

Verdict: undefined

http://example.com/

Allow: /$

Disallow: /

Verdict: allow

http://example.com/page.htm

Allow: /$

Disallow: /

Verdict: disallow

发送以下问题的反馈:

此网页