웹 개발
robots.txt에서 /admin은 막고 /posts는 여는 설정
robots.txt를 제대로 관리하지 않으면 관리자 페이지가 검색엔진에 노출되거나, 글 목록이 색인에서 빠지는 상황이 생긴다.
블로그나 서비스를 운영하면 robots.txt를 한 번은 들여다보게 된다. 기본값이 전체 허용이라 딱히 설정하지 않아도 돌아가지만, /admin 경로가 Google에 색인되는 건 바람직하지 않다.
기본 구조
User-agent: *
Disallow: /admin
Disallow: /api
Disallow: /dashboard
Allow: /posts
Allow: /
Sitemap: https://example.com/sitemap.xml
User-agent: *는 모든 크롤러에 적용한다는 뜻이다. Disallow와 Allow는 더 구체적인 경로가 우선한다. /api를 막고 /api/public을 열고 싶으면:
Disallow: /api
Allow: /api/public
Allow가 뒤에 있어도 더 구체적인 경로가 우선하므로 /api/public은 허용된다.
Next.js에서 robots.txt 생성
Next.js 13 이상이면 app/robots.ts로 프로그래밍 방식으로 생성할 수 있다.
// app/robots.ts
import { MetadataRoute } from 'next'
export default function robots(): MetadataRoute.Robots {
return {
rules: [
{
userAgent: '*',
allow: '/',
disallow: ['/admin', '/api', '/dashboard'],
},
],
sitemap: 'https://example.com/sitemap.xml',
}
}
빌드하면 /robots.txt로 자동 서빙된다.
확인 방법
설정 후 실제로 올바르게 서빙되는지 확인한다.
curl https://example.com/robots.txt
Google Search Console의 "robots.txt 테스터"를 쓰면 특정 URL이 차단되는지 아닌지를 시각적으로 확인할 수 있다. 사이트를 운영 중이라면 Search Console에서 한 번 확인해보는 것이 좋다.
주의할 점
robots.txt는 접근 차단이 아니다. 크롤러에게 색인하지 말라고 요청하는 것이고, 악의적인 봇은 이를 무시한다. /admin을 robots.txt에서 막는다고 해서 실제 접근이 차단되는 건 아니다. 관리자 페이지 보안은 인증/인가 미들웨어로 따로 처리해야 한다.
색인 제외가 목적이라면 robots.txt 대신 해당 페이지에 <meta name="robots" content="noindex"> 태그를 붙이는 방법도 있다. 경로 패턴이 복잡하거나 동적으로 결정되는 경우에는 메타 태그 방식이 더 정확하다.