robots.txt의 Allow와 Disallow 우선순위|*와 $의 의미
robots.txt에서 같은 URL에 Allow와 Disallow가 둘 다 해당될 때 어느 쪽이 쓰일까요? '위에 쓴 쪽이 우선'이라고 생각하기 쉽지만 Google의 해석은 다릅니다. 이 글에서는 Google이 채택한 '가장 길게 일치한 규칙이 이긴다'는 방식, 와일드카드 '*'와 끝의 '$'의 의미, '/fish'와 '/fish/'의 차이, 대소문자와 비ASCII URL의 처리를 예시로 설명합니다.
기본 규칙: 가장 길게 일치한 규칙이 이긴다
Google은 URL 경로에 일치하는 Allow와 Disallow를 모두 모은 뒤, 그중 패턴의 글자 수가 가장 긴 규칙을 씁니다. 긴 패턴일수록 '구체적인 지시'로 보는 사고방식입니다. 쓴 순서는 상관없습니다. 이 해석 방식은 robots.txt의 표준 사양(RFC 9309)에도 적혀 있습니다.
| robots.txt | URL | 결과 | 이유 |
|---|---|---|---|
| Disallow: /blog/ / Allow: /blog/public/ | /blog/public/a.html | 허용 | Allow(13자)가 Disallow(6자)보다 길다 |
| Disallow: /blog/ / Allow: /blog/public/ | /blog/secret.html | 차단 | 일치하는 것은 Disallow: /blog/뿐 |
| Allow: /blog/ / Disallow: /blog/private/ | /blog/private/x | 차단 | Disallow 쪽이 길다. 위에 Allow가 있어도 상관없다 |
| Disallow: / / Allow: /$ | / | 허용 | /$는 /보다 길다($도 1자로 센다) |
| Disallow: / / Allow: /$ | /about | 차단 | /$는 홈페이지에만 일치 |
참고로 Bing도 대체로 같은 방식으로 해석하지만, 오래된 크롤러나 일부 도구 중에는 '위에서부터 읽어 처음 일치한 규칙을 쓰는' 것도 있습니다. 어떤 크롤러에서도 같은 결과가 나오게 하고 싶다면 Allow를 Disallow보다 위에 써 두는 것이 안전합니다.
경로는 전방 일치: '/fish'와 '/fish/'의 차이
Allow·Disallow에 쓴 경로는 URL의 앞부분부터 일치하는지(전방 일치)로 비교합니다. 그래서 끝에 슬래시가 있느냐 없느냐에 따라 차단되는 범위가 크게 달라집니다.
| 패턴 | 일치하는 예 | 일치하지 않는 예 |
|---|---|---|
| /fish | /fish, /fish.html, /fish/salmon.html, /fishheads | /Fish.asp, /catfish, /?id=fish |
| /fish/ | /fish/, /fish/salmon.html, /fish/?id=1 | /fish, /fish.html, /Fish/Salmon.asp |
| / | 사이트의 모든 URL | — |
| (빈칸) | 아무것에도 일치하지 않음(Disallow:만 쓰면 전부 허용) | — |
'Disallow: /admin'이라고 쓰면 /admin/ 외에 /administrator나 /admin-guide.html까지 차단됩니다. 폴더 안만 차단하고 싶다면 'Disallow: /admin/'처럼 끝에 슬래시를 붙입니다. WordPress 기본값인 'Disallow: /wp-admin/'이 /wp-admin-guide/를 차단하지 않는 것도 이 차이 때문입니다.
'*'와 '$'의 의미와 사용법
Google과 Bing은 패턴 안의 2가지 기호를 특별하게 취급합니다. '*'는 0자 이상의 어떤 문자열에도 일치하고, '$'는 패턴의 마지막에 두었을 때만 'URL의 끝'을 뜻합니다.
| 패턴 | 의미 | 일치함 | 일치하지 않음 |
|---|---|---|---|
| /*.php | 중간에 .php를 포함 | /index.php, /a.php?x=1, /a.php5 | /windows.PHP |
| /*.php$ | .php로 끝남 | /index.php, /dir/a.php | /a.php?x=1, /a.php5 |
| /*.pdf$ | .pdf로 끝남 | /files/manual.pdf | /files/manual.pdf?download=1 |
| /*? | 쿼리(?)가 붙음 | /?a=1, /items?color=red | /items |
| /*?*sort= | 쿼리 안에 sort=를 포함 | /items?color=red&sort=price | /items?color=red |
| /fish* | /fish와 같음(끝의 *는 의미 없음) | /fish, /fishheads | /catfish |
- '$'는 마지막에 두었을 때만 특별한 의미가 됩니다. '/a$b'처럼 중간에 둔 $는 그냥 문자로 취급됩니다.
- '**'는 '*' 하나와 같습니다.
- '*bot'처럼 User-agent 이름에 와일드카드는 쓸 수 없습니다. '*'를 쓸 수 있는 것은 'User-agent: *' 형태뿐입니다.
- 패턴은 '/'나 '*'로 시작합니다. 'Disallow: private/'처럼 /를 빠뜨리면 어떤 URL에도 일치하지 않습니다.
검색 결과·파라미터가 붙은 URL을 크롤링에서 빼는 예
사이트 내 검색 결과나 정렬·필터 파라미터가 붙은 URL은 조합에 따라 거의 무한히 늘어납니다. 크롤링 낭비를 줄이기 위해 robots.txt에서 빼는 경우가 많습니다.
- 1
Disallow: /search
/search와 /search?q=신발을 차단합니다. 전방 일치이므로 /search-tips 같은 URL도 차단된다는 점에 주의합니다.
- 2
Disallow: /*?s=
WordPress의 사이트 내 검색(/?s=키워드, /blog/?s=…)을 차단합니다.
- 3
Disallow: /*?*sort=
쿼리 어딘가에 sort=를 포함한 URL을 차단합니다. /items?color=red는 차단하지 않고, /items?color=red&sort=price는 차단합니다.
- 4
Allow: /search/help
/search 차단 안에서 도움말 페이지만 허용합니다. Allow 쪽이 길기 때문에 쓰는 순서와 상관없이 허용이 됩니다.
파라미터 순서가 바뀌면 일치하지 않게 되는 작성법도 있으므로, '/*?sort='보다 '/*?*sort='처럼 사이에 *를 넣어 두면 누락을 줄일 수 있습니다. 실제 URL을 몇 종류 나열해 테스터로 결과를 확인한 뒤 공개하세요.
대소문자와 비ASCII URL의 처리
- 경로는 대소문자를 구별합니다. 'Disallow: /Admin/'은 /admin/을 차단하지 않습니다. URL에 대문자가 섞이는 CMS에서는 둘 다 쓰거나 실제 URL에 맞춥니다.
- User-agent 이름은 대소문자를 구별하지 않습니다. 'googlebot'이든 'Googlebot'이든 같습니다.
- 한글 같은 비ASCII 경로는 'Disallow: /카테고리/'처럼 그대로 써도, 'Disallow: /%EC%B9%B4%ED%85%8C%EA%B3%A0%EB%A6%AC/'처럼 %인코딩해도 Google은 같은 것으로 취급합니다. 파일은 UTF-8로 저장합니다.
- %인코딩의 영문자(%EC와 %ec)는 대소문자를 구별하지 않습니다.
robots.txt 테스터도 Google과 마찬가지로 비ASCII 경로와 %인코딩을 같은 URL로 비교합니다. 어느 작성법이든 결과가 바뀌지 않는지 실제 URL로 시험해 두면 안심입니다. 그룹이 선택되는 방식은 User-agent 작성법과 그룹이 선택되는 방식을, 써 두었는데 효과가 없을 때의 원인은 robots.txt 확인 방법도 참고하세요.
자주 묻는 질문
- robots.txt는 위에 쓴 규칙이 우선되나요?
- Google에서는 쓴 순서는 상관없습니다. 일치한 규칙 중 패턴이 가장 긴 것을 쓰고, 길이가 같으면 Allow를 씁니다. 위에서부터 차례로 읽는 크롤러에도 대응하고 싶다면 Allow를 먼저 써 두는 것이 안전합니다.
- robots.txt의 $는 무슨 뜻인가요?
- 패턴의 마지막에 둔 '$'는 'URL의 끝'을 뜻합니다. 'Disallow: /*.pdf$'는 .pdf로 끝나는 URL만 차단하고, /a.pdf?download=1처럼 쿼리가 이어지는 URL은 차단하지 않습니다.
- Disallow: /admin과 Disallow: /admin/은 다른가요?
- 다릅니다. '/admin'은 전방 일치이므로 /administrator나 /admin.html도 차단합니다. '/admin/'은 폴더 안만 차단하고, /admin(슬래시 없음)은 차단하지 않습니다.
- Allow: /와 Disallow: /를 둘 다 쓰면 어떻게 되나요?
- 둘 다 패턴 길이가 1자로 같으므로 Google은 Allow를 쓰고, 전부 허용이 됩니다. 사이트 전체를 차단하고 싶다면 Allow: /를 지우세요.
이 글에서 소개한 도구
함께 읽으면 좋은 글
robots.txt 확인 방법: 테스터가 없어진 뒤 차단을 알아보는 순서
Google Search Console에 있던 robots.txt 테스터는 2023년 12월에 제공이 끝나 지금은 ‘robots.txt 보고서’로 바뀌었습니다. 보고서에서는 ‘URL을 넣고 차단되는지 시험하기’를 할 수 없어서 ‘어디서 확인해야 하지?’ 하고 헤매는 사람이 늘었습니다. 이 글에서는 robots.txt를 두는 곳과 여는 법, Search Console 보고서와 URL 검사 도구로 알 수 있는 것·알 수 없는 것, 테스터로 URL별 판정을 확인하는 순서, 수정한 뒤 반영되기까지의 흐름을 정리합니다.
글 읽기 →robots.txt의 User-agent 작성법: *와 Googlebot을 둘 다 쓰면
robots.txt에 ‘User-agent: *’ 그룹과 ‘User-agent: Googlebot’ 그룹을 둘 다 쓰면 Googlebot은 ‘*’의 규칙을 쓰지 않게 됩니다. 이것을 모르고 Googlebot용 그룹을 추가했다가 막아 두었던 페이지가 크롤링되기 시작하는 문제가 흔합니다. 이 글에서는 크롤러가 어느 그룹을 쓰는지 정해지는 방식, Googlebot-Image나 AdsBot-Google 같은 특별한 경우, 그룹 묶는 법과 잘못 쓰기 쉬운 점을 설명합니다.
글 읽기 →robots.txt로 AI 크롤러 차단하기: GPTBot·ClaudeBot
내 사이트의 글이나 이미지가 AI 학습에 쓰이는 것을 원하지 않는 운영자가 늘고 있습니다. robots.txt에 AI 크롤러의 이름을 적으면 각 회사의 크롤러에 수집을 멈춰 달라고 알릴 수 있습니다. 다만 AI 크롤러에는 ‘학습용’, ‘AI 검색용’, ‘사용자 요청으로 여는 것’이 있어서 어느 것을 막느냐에 따라 영향이 크게 달라집니다. 이 글에서는 주요 AI 크롤러의 이름과 역할, 목적별 robots.txt 작성법, 차단할 때의 주의점을 정리합니다.
글 읽기 →