
robots.txt란? 검색엔진 크롤링을 제어하는 방법
웹사이트를 운영하다 보면 구글 서치 콘솔, 네이버 서치어드바이저, 빙 웹마스터 등을 사용하게 됩니다. 이때 가장 먼저 확인해야 하는 파일 중 하나가 바로 robots.txt 입니다. 저 역시 네이버, 티스토리 블로그를 운영하다 개인 블로그(win-j.com)를 운영하면서 robots.txt 설정 문제로 검색 노출과 크롤링에 어려움을 겪었고, 특히 구글 서치 콘솔에서 여러 차례 상태를 확인하며 수정했던 경험이 있습니다.
robots.txt란 ?
robots.txt는 검색엔진 크롤러에게 어떤 페이지를 크롤링해도 되는지 알려주는 규칙 파일입니다.
예를 들어 관리자 페이지나 테스트 페이지 처럼 검색 결과에 노출할 필요가 없는 경로는 robots.txt를 이용해 크롤링을 제한할 수 있습니다. 반대로 노출되어야 하는 페이지는 정상적으로 접근할 수 있도록 설정해야 합니다.

왜 필요할까?
검색엔진은 사이트에 접속하면 가장 먼저 https://도메인/robots.txt 파일을 확인합니다. 이 파일을 통해 크롤링 허용 여부, 크롤링 제외 여부, Sitemap위치 등을 확인한 뒤 사이트를 탐색합니다. robots.txt를 잘못 작성하면 중요한 페이지가 검색되지 않거나, 반대로 공개하면 안되는 페이지가 노출될 수도 있습니다.
User-agent와 Allow/Disallow
가장 기본적인 robots.txt 예제는 다음과 같습니다.
User-agent: * Allow: / Disallow: /admin/ Sitemap: https://win-j.com/sitemap.xml
- User-agent : 규칙을 허용할 검색엔진 ( * 는 모든 검색엔진)
- Allow : 크롤링 허용
- Disallow : 크롤링 차단
- Sitemap : 사이트맵 위치 안내
위에 처럼 특정 관리자 페이지를 제외하고 싶다면 Disallow : /admin/ 을 추가합니다.
Django에서 robots.txt를 제공하는 방법
Django에서는 크게 세 가지 방법으로 robots.txt를 제공할 수 있습니다.
1. 정적 파일로 제공하기
내용이 거의 바뀌지 않는 사이트라면 가장 단순한 방법입니다. 프로젝트의 정적 파일 또는 Nginx가 직접 제공하는 경로에 robots.txt파일을 생성합니다.
User-agent: *
Disallow: /admin/
Allow: /
Sitemap: https://win-j.com/sitemap.xml
User-agent: *
Disallow: /admin/
Allow: /
Sitemap: https://win-j.com/sitemap.xmlNginx에서 직접 제공한다면 Django를 거치지 않기 때문에 구조가 단순하고 응답도 빠릅니다. 다만 서버 이전이나 도메인 변경 시 robots.txt안에 입력된 sitemap 주소를 직접 수정해야 합니다.
2. URL과 View에서 직접 생성하기
Django의 View가 robots.txt 내용을 문자열로 반환하도록 만들 수 있습니다.
먼저 views.py에 다음 코드를 작성합니다.
from django.http import HttpResponse
def robots_txt(request):
lines = [
"User-agent: *",
"Disallow: /admin/",
"Allow: /",
"",
"Sitemap: https://win-j.com/sitemap.xml",
]
return HttpResponse(
"\n".join(lines),
content_type="text/plain; charset=utf-8",
)HttpRespones에 문자열을 전달하고 content_type을 text/plain으로 지정하면 브라우저가 일반 HTML이 아닌 텍스트 파일로 인식합니다.
다음으로 프로젝트의 urls.py에 경로를 연결합니다.
from django.contrib import admin
from django.urls import path
from blog.views import robots_txt
urlpatterns = [
path("admin/", admin.site.urls),
path("robots.txt", robots_txt, name="robots_txt"),
]robots.txt는 도메인의 루트에서 제공되어야 하므로 다음 주소로 접속되어야 합니다.
다음처럼 앱 내부 경로에 생성하면 검색엔진이 기본 위치에서 파일을 찾지 못할 수 있습니다.
따라서 일반적으로 프로젝트 최상위 urls.py에 등록하는 것이 관리가 편합니다.
3. 템플릿을 이용해 동적으로 생성하기
운영 환경과 개발 환경의 규칙을 다르게 하거나 도메인 정보를 설정값에서 가져오려면 템플릿 방식이 유용합니다.
먼저 다음 위치에 템플릿을 생성합니다.
templates/robots.txt템플릿 내용은 다음과 같이 작성할 수 있습니다.
User-agent: *
Disallow: /admin/
{% if not is_production %}
Disallow: /
{% else %}
Allow: /
Sitemap: {{ sitemap_url }}
{% endif %}그다음 views.py에서 템플릿을 렌더링합니다.
from django.conf import settings
from django.shortcuts import render
def robots_txt(request):
context = {
"is_production": not settings.DEBUG,
"sitemap_url": request.build_absolute_uri("/sitemap.xml"),
}
return render(
request,
"robots.txt",
context,
content_type="text/plain; charset=utf-8",
)URL 설정은 앞의 방식과 동일합니다.
from django.urls import path
from blog.views import robots_txt
urlpatterns = [
path("robots.txt", robots_txt, name="robots_txt"),
]request.build_absolute_uri("/sitemap.xml")를 사용하면 현재 요청의 도메인을 기준으로 전체 Sitemap 주소를 만들 수 있습니다.
예를 들어 운영 서버에서는 다음과 같이 출력될 수 있습니다.
Sitemap: https://win-j.com/sitemap.xml이 방식은 개발용 도메인, 운영 도메인 또는 여러 사이트를 구분해야 할 때 편리합니다.
다만 DEBUG 값만으로 운영 환경을 완전히 구분하기보다는 별도의 환경변수를 사용하는 것이 더 안전합니다.
import os
IS_PRODUCTION = os.getenv("DJANGO_ENV") == "production"이를 View에서 사용할 수 있습니다.
from django.conf import settings
from django.shortcuts import render
def robots_txt(request):
context = {
"is_production": settings.IS_PRODUCTION,
"sitemap_url": request.build_absolute_uri("/sitemap.xml"),
}
return render(
request,
"robots.txt",
context,
content_type="text/plain; charset=utf-8",
)Django에서 어떤 방식을 사용해야 할까?
| 방식 | 적합한 경우 |
|---|---|
| 정적 파일 | 규칙과 도메인이 거의 변경되지 않는 사이트 |
| view 직접 변환 | 설정이 단순하지만 Django에서 관리하고 싶은 경우 |
| 템플릿 동적 생성 | 개발·운영 환경이나 도메인별 규칙이 다른 경우 |
| Nginx 직접 제공 | Django를 거치지 않고 빠르게 응답하고 싶은 경우 |
개인 블로그 처럼 robots.txt 내용이 자주 바뀌지 않는다면 정적 파일 또는 View 직접 변환 방식으로도 충분합니다. 반대로 여러 도메인이나 개발 운영 환경을 함께 관리한다면 템플릿 기반 동적 생성 방식이 더 유연합니다.
설정 후 확인 방법
브라우저에서 다음 주소를 직접 열어봅니다.
https://win-j.com/robots.txt다음 사항을 확인해야 합니다.
- HTTP 상태 코드가
200인지 - HTML 코드가 섞이지 않았는지
Content-Type이text/plain인지- Sitemap 주소가 실제 주소와 일치하는지
- 운영 페이지가
Disallow: /로 차단되지 않았는지
서버에서는 다음 명령으로도 확인할 수 있습니다.
curl -I https://win-j.com/robots.txt본문까지 확인하려면 다음 명령을 사용합니다.
curl https://win-j.com/robots.txt마무리
robots.txt는 작은 텍스트 파일이지만 검색엔진이 사이트를 탐색할 때 참고하는 중요한 설정입니다. 특히 Disallow: /처럼 사이트 전체를 제한할 수 있는 규칙을 잘못 적용하면 정상적인 게시글까지 크롤링되지 않을 수 있습니다. Django 사이트를 운영한다면 robots.txt가 루트 주소에서 정상적으로 반환되는지, 필요한 페이지가 허용되어 있는지, sitemap.xml 주소가 정확한지 반드시 확인해 보세요.
첫 댓글을 남겨보세요.