Robots.txt 规范

摘要

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

返回页首

语言要求

本文档中的关键字“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY”和“OPTIONAL”需按照 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 网址的示例:

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/
子网域上的 robots.txt 仅对该子网域有效。
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/ IDN 等同于其对应的 punycode 版本。另请参阅 RFC 3492
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 上) 以 IP 地址作为主机名的 robots.txt 仅在抓取作为主机名的 IP 地址时有效。此类 robots.txt 并不会自动对该 IP 地址上托管的所有网站有效(尽管该文件可能是共享的,在此情况下,该文件也可以在共享主机名下使用)。
http://example.com:80/robots.txt http://example.com:80/
http://example.com/
http://example.com:81/ 标准端口号(http 为 80;https 为 443;ftp 为 21)等同于其默认的主机名。另请参阅 [端口号]。
http://example.com:8181/robots.txt http://example.com:8181/ http://example.com/ 非标准端口号上的 robots.txt 文件仅对通过这些端口号提供的内容有效。

返回页首

处理 HTTP 结果代码

一般情况下,robots.txt 文件会出现三种不同的抓取结果:

  • 全部允许:所有内容均可抓取。
  • 全部禁止:所有内容均不能抓取。
  • 有条件地允许:由 robots.txt 中的指令决定是否可以抓取某些内容。
2xx(成功)
HTTP 结果代码,表示成功的“有条件地允许”抓取结果。
3xx(重定向)
一般情况下,系统会跟踪重定向,直到发现有效的结果(或确认出现循环)。我们会跟踪有限次数的重定向(适用于 HTTP/1.0 的 RFC 1945 最多允许 5 次重定向),然后便会停止,并将其作为 404 错误进行处理。我们并未定义如何处理指向禁止网址的 robots.txt 重定向,并且不建议用户进行处理。同样,我们也未定义如何根据返回 2xx 的 HTML 内容处理 robots.txt 文件的逻辑重定向(框架、JavaScript 或元刷新型重定向),并且不建议用户进行处理。
4xx(客户端错误)
Google 对所有 4xx 错误都采用同一种处理方式,并且假定不存在有效的 robots.txt 文件。Google 假定不存在任何限制。这表示抓取时采用“全部允许”。注意:其中包括 401“未授权”和 403“禁止访问”HTTP 结果代码。
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 将该上限设为 500kb。

返回页首

正式语法/定义

下面是一段 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”的语法。

返回页首

记录分组

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

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

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

    • user-agent(组起始)
    • disallow(仅在作为组成员记录时有效)
    • allow(仅在作为组成员记录时有效)
    • sitemap(非组内容记录)
    • 其他所有 <field> 元素可能会被忽略。

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

      示例组:

      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] 值,该路径值将被视作 robots.txt 文件抓取网站根目录的相对路径(使用相同的协议、端口号、主机和域名)。若要指定根目录,路径值必须以“/”开头。如果路径开头无斜杠,那么表示该路径就是当前位置。路径区分大小写。有关详情,请参阅下面的“基于路径值的网址匹配”部分。

      disallow

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

      用法:

      disallow: [path]
      

      allow

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

      用法:

      allow: [path]
      

      返回页首

      基于路径值的网址匹配

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

      注意:“AJAX-Crawling”网址必须在其抓取的版本中指定。另请参阅关于使 AJAX 应用可供抓取的文档。

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

      1. * 指定任何有效字符的 0 个或多个实例
      2. $ 指定网址的末尾

      路径匹配示例

      [路径]匹配 不匹配注释
      /任何有效网址  匹配根目录以及任何下级网址
      /*等同于 / 等同于 / 等同于“/”- 忽略结尾的通配符。
      /fish/fish
      /fish.html
      /fish/salmon.html
      /fishheads
      /fishheads/yummy.html
      /fish.php?id=anything
      /Fish.asp
      /catfish
      /?id=fish
      注意:匹配区分大小写。
      /fish*/fish
      /fish.html
      /fish/salmon.html
      /fishheads
      /fishheads/yummy.html
      /fish.php?id=anything
      /Fish.asp
      /catfish
      /?id=fish
      等同于“/fish”- 忽略结尾的通配符。
      /fish//fish/
      /fish/?id=anything
      /fish/salmon.htm
      /fish
      /fish.html
      /Fish/Salmon.asp
      结尾的斜杠表示此项与此文件夹中的任何内容均匹配。
      fish/等同于 /fish/ 等同于 /fish/ 等同于 /fish/
      /*.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 /p /允许 
      http://example.com/folder/page /folder/ /folder允许 
      http://example.com/page.htm /page /*.htm未定义 
      http://example.com/ /$ /允许 
      http://example.com/page.htm /$ /禁止 

      返回页首