robots.txt 사양

개요

이 문서에서는 Google의 웹사이트 크롤러가 공개적으로 액세스 가능한 웹사이트를 크롤링하고 색인을 생성하는 방식을 제어하는 robots.txt 파일을 Google에서 어떻게 처리하는지 설명합니다.

변경사항

2019년 7월 1일, Google에서는 robots.txt 프로토콜이 인터넷 표준이 되어 가고 있다고 발표했습니다. 이러한 변경사항은 이 문서에 반영되어 있습니다.

기본 정의

정의
크롤러 크롤러: 크롤러는 웹사이트를 크롤링하는 서비스 또는 에이전트입니다. 일반적으로 크롤러는 표준 웹브라우저를 통해 액세스할 수 있는 콘텐츠를 노출하는 호스트의 알려진 URL에 재귀적으로 자동 액세스합니다. 또한 기존에 크롤링된 페이지의 링크나 사이트맵 파일 등 다양한 방법을 통해 새로운 URL이 발견되면 같은 방식으로 크롤링됩니다.
사용자 에이전트 특정 크롤러나 크롤러 집합을 식별하는 수단입니다.
명령어 robots.txt 파일에 명시된 크롤러 또는 크롤러 그룹에 적용할 수 있는 가이드라인의 목록입니다.
URL RFC 1738에 정의된 Uniform Resource Locator입니다.
Google에만 해당 이 요소는 Google의 robots.txt 구현과 관련된 것으로 타사와는 관련이 없을 수도 있습니다.

적용 여부

Google의 자동화된 모든 크롤러는 본 문서에 명시된 가이드라인을 따릅니다. 에이전트가 사용자 대신 URL에 액세스할 때는(예: 번역, 수동으로 구독한 피드, 멀웨어 분석) 이러한 가이드라인을 적용할 필요가 없습니다.

파일 위치 및 유효성 범위

robots.txt 파일은 호스트의 최상위 디렉터리에 위치하여 관련 프로토콜과 포트 번호를 통해 액세스할 수 있어야 합니다. robots.txt에서 일반적으로 허용되는 프로토콜은 모두 URI 기반이며, 특히 Google 검색(예: 웹사이트 크롤링)의 경우에는 'HTTP'와 'HTTPS'입니다. HTTP와 HTTPS에서 robots.txt 파일은 조건부가 아닌 HTTP GET 요청을 사용하여 가져옵니다.

Google에만 해당: Google은 FTP 사이트에서도 robots.txt 파일을 허용하며 이를 따릅니다. FTP 기반 robots.txt 파일은 익명 로그인을 사용하여 FTP 프로토콜을 통해 액세스됩니다.

robots.txt 파일에 나열된 명령어는 파일이 호스팅된 호스트, 프로토콜, 포트 번호에만 적용됩니다.

유효한 robots.txt URL의 예

robots.txt URL 예
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에만 해당: 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에 정의된 대로 5개 이상의 리디렉션 홉을 따른 다음 중단하고 이를 404로 처리합니다. robots.txt 파일이 허용되지 않는 URL로 리디렉션 처리되는 경우는 권장되지 않습니다. 아직 가져온 규칙이 없으므로 5개 이상의 홉에 대해 리디렉션이 이어지고, robots.txt가 없는 경우 Google은 robots.txt에 대해 이를 404로 처리합니다. 2xx를 반환하는 HTML 콘텐츠 기반의 robots.txt 파일에 관한 논리적 리디렉션(프레임, 자바스크립트, 메타 새로고침 유형 리디렉션)의 처리는 권장되지 않으며 첫 번째 페이지의 콘텐츠는 적절한 규칙을 찾는 데 사용됩니다.
4xx(클라이언트 오류) 모든 4xx 오류는 같은 방식으로 처리되며 유효한 robots.txt 파일이 없다고 가정합니다. 또한 제한이 없다고 가정합니다. 크롤링의 '전체 허용'입니다.
5xx(서버 오류)

서버 오류는 크롤링 '전체 금지'의 원인이 되는 일시적인 오류입니다. 서버 오류가 아닌 HTTP 결과 코드를 얻을 때까지 요청이 다시 시도됩니다. 503(서비스를 사용할 수 없음) 오류는 잦은 재시도로 이어집니다. robots.txt에 30일 넘게 연결할 수 없는 경우 robots.txt의 마지막으로 캐시된 사본이 사용됩니다. 사용할 수 없는 경우, Google은 크롤링 제한이 없다고 가정합니다. 크롤링을 일시중지하려면 503 HTTP 결과 코드를 사용하는 것이 좋습니다.

Google에만 해당: Google이 누락된 페이지와 관련해 404 대신 5xx를 반환하도록 사이트가 잘못 구성된 것으로 판단할 수 있는 경우 사이트의 5xx 오류를 404로 처리합니다.

실패한 요청 또는 불완전한 데이터 시간 초과, 잘못된 응답, 연결 재설정/중단, HTTP 청킹 오류와 같은 DNS 또는 네트워크 문제로 인해 가져올 수 없는 robots.txt 파일의 처리는 서버 오류로 처리됩니다.
캐싱 robots.txt 콘텐츠는 일반적으로 최대 24시간 분량이 캐시되지만 시간 초과 또는 5xx 오류 등으로 인해 캐시된 버전을 새로 고칠 수 없는 경우 캐시 기간이 더 길어질 수 있습니다. 캐시된 응답은 다른 크롤러에 의해 공유될 수 있습니다. Google은 max-age Cache-Control HTTP 헤더를 기반으로 하여 캐시 기간을 늘리거나 줄일 수 있습니다.

파일 형식

필요한 파일 형식은 UTF-8로 인코딩된 일반 텍스트입니다. 파일은 CR, CR/LF 또는 LF로 구분된 행으로 구성됩니다.

유효한 행만 고려되며 그 외 다른 콘텐츠는 모두 무시됩니다. 예를 들어 결과 문서가 HTML 페이지인 경우 유효한 텍스트 줄만 고려되며 나머지는 경고나 오류를 내보내지 않고 삭제됩니다.

문자 인코딩이 사용되었는데 사용된 문자가 UTF-8 하위 집합이 아닌 경우 파일 콘텐츠가 잘못 파싱될 수 있습니다.

robots.txt 파일 첫 부분의 선택적 유니코드 BOM(바이트 순서 표시)은 무시됩니다.

유효한 각 행은 필드, 콜론 및 값으로 구성됩니다. 공백은 선택사항이지만 가독성 향상을 위해 사용하는 것이 좋습니다. 주석은 '#' 문자를 사용하여 파일의 어느 위치에나 삽입될 수 있습니다. 주석의 시작부터 행의 끝까지 모든 내용은 주석으로 처리되며 무시됩니다. 일반적인 형식은 <field>:<value><#optional-comment>입니다. 행의 시작과 끝에 있는 공백은 무시됩니다.

<field> 요소는 대소문자를 구분하지 않습니다. <value> 요소는 <field> 요소에 따라 대소문자를 구분할 수 있습니다.

사소한 오류나 오타가 있는 <field> 요소(예: 'user-agent' 대신 'useragent' 사용)의 처리는 지원되지 않습니다.

크롤러당 최대 파일 크기가 제한될 수 있습니다. 최대 파일 크기를 넘는 콘텐츠는 무시됩니다. 현재 Google에서는 크기를 500키비바이트(KiB)로 제한합니다. robots.txt 파일의 크기를 줄이려면 robots.txt 파일의 크기가 커질 수 있는 명령어를 통합합니다. 예를 들어, 제외된 자료를 별도의 디렉터리에 배치합니다.

공식 구문/정의

다음은 RFC 5234에 나와 있는 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 행에 하나 이상의 규칙이 이어집니다. 그룹은 user-agent 행 또는 파일의 끝으로 종료됩니다. 마지막 그룹에는 규칙이 없기 때문에 암시적으로 모든 항목이 허용됩니다.

예제 그룹:

    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' 모두에 해당하는 그룹이 있습니다. 마지막 그룹을 제외하고 각 그룹에는 고유한 group-member 행이 있습니다. 마지막 그룹은 비어 있습니다. 가독성을 높이기 위해 공백과 빈 줄을 사용할 수도 있습니다.

user-agent 우선순위

특정 크롤러에 대해 하나의 그룹만 유효합니다. 크롤러는 일치하는 가장 구체적인 user-agent가 있는 그룹을 찾아서 올바른 행 그룹을 결정해야 합니다. 다른 모든 그룹은 크롤러에 의해 무시됩니다. user-agent는 대소문자를 구분합니다. 일치하지 않는 모든 텍스트는 무시됩니다. 예를 들어 googlebot/1.2googlebot*은 모두 googlebot과 같습니다. robots.txt 파일 내 그룹의 순서는 관련이 없습니다.

특정 user-agent에 두 개 이상의 그룹이 있는 경우 특정 user-agent에 적용되는 그룹의 모든 규칙이 결합됩니다.

다음 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의 크롤러 및 user-agent 문자열도 참조하세요.

group-member 규칙

본 섹션에서는 표준 group-member 규칙만 다룹니다. 이러한 규칙은 크롤러에서는 '명령어'라고 불립니다. 명령어는 directive: [path] 형식으로 지정되며, 여기에서 [path]는 선택사항입니다. 기본적으로 지정된 크롤러에 관한 크롤링의 제한은 없습니다. [path]가 없는 명령어는 무시됩니다.

지정되는 경우 [path] 값은 동일한 프로토콜과 포트 번호, 호스트, 도메인 이름을 사용하여 robots.txt 파일을 가져온 웹사이트의 루트로부터 상대적인 것으로 간주됩니다. 경로값은 '/' 기호로 시작하여 루트를 지정해야 합니다. 경로는 대소문자를 구분합니다. 자세한 내용은 아래의 '경로값에 의한 URL 일치' 섹션을 참조하세요.

disallow

disallow 명령어는 지정된 크롤러가 액세스해서는 안 되는 경로를 지정합니다. 경로를 지정하지 않으면 명령어가 무시됩니다.

사용:

    disallow: [path]
    

allow

allow 명령어는 지정된 크롤러가 액세스할 수 있는 경로를 지정합니다. 경로를 지정하지 않으면 명령어가 무시됩니다.

사용:

    allow: [path]
    

경로값에 의한 URL 일치

경로값은 사이트의 특정 URL에 규칙을 적용할지 여부를 결정하기 위한 기준으로 사용됩니다. 와일드 카드를 제외하고 경로는 URL 및 같은 경로로 시작하는 유효한 모든 URL의 시작 부분을 일치시키는 데 사용됩니다. RFC 3986에 따라 UTF-8 문자 또는 퍼센트 이스케이프 처리된 UTF-8 인코딩된 문자로 7비트가 아닌 ASCII 문자가 경로에 포함될 수 있습니다.

Google, Bing 및 기타 주요 검색엔진에서는 경로값에 제한된 형태의 '와일드 카드'를 지원합니다. 이러한 와일드카드는 다음과 같습니다.

  • * 기호는 0개 이상의 유효한 문자를 나타냅니다.
  • $ 기호는 URL의 끝을 나타냅니다.
경로 일치의 예
/ 루트 및 그 이하 수준의 모든 URL과 일치합니다.
/* / 기호와 같습니다. 뒤쪽 와일드 카드는 무시됩니다.
/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에서 지원하는 non-group-member 행

sitemaps.org에 정의된 대로 Google, Bing 및 기타 주요 검색엔진에서 sitemap을 지원합니다.

사용:

    sitemap: [absoluteURL]
    

[absoluteURL]은 사이트맵이나 사이트맵 색인 파일 또는 그에 상응하는 URL을 가리킵니다. URL이 robots.txt 파일과 같은 호스트에 있을 필요는 없습니다. 여러 sitemap 항목이 존재할 수 있습니다. non-group-member 행으로서 어떠한 특정 user-agent에도 연결되어 있지 않으며 disallow로 지정하지 않은 모든 크롤러가 검색할 수 있습니다.

group-member 행의 우선순위

group-member 수준에서 특히 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