사이트맵 301 리디렉션 URL 정리, GSC 위생 관리
목차
사이트맵 파일 하나 손보는 게 뭐가 대수냐 싶을 수 있다. 근데 이게 생각보다 꽤 의미 있는 작업이었다. Google Search Console 위생 관리라는 맥락 안에서 보면, 작은 수정 하나가 크롤 예산과 색인 품질에 영향을 준다.
문제의 발단: 사이트맵 안에 301이 들어가 있었다
발단은 GSC 점검이었다. 크롤링 리포트를 훑다 보면 가끔 제출된 URL이 리디렉션됩니다라는 항목이 눈에 밟힌다. 대부분 이런 건 "나중에 정리하면 되지"하고 넘기는 경향이 있는데, 규모가 커지면 무시할 수 없어진다.
이번 경우는 /terms/ 경로였다. 이 URL이 사이트맵에 버젓이 올라가 있었는데, 실제로 접근하면 301 리디렉션이 발생하고 있었다. 즉 Googlebot 입장에서는 사이트맵이 "이 URL 색인해줘"라고 요청하고 있는데, 막상 따라가 보면 다른 곳으로 튕겨나가는 상황이다.
이게 왜 문제가 되냐면:
- Googlebot 은 사이트맵 URL 을 신뢰할 수 있는 우선순위 목록으로 취급한다
- 리디렉션되는 URL 이 사이트맵에 있으면, 구글 입장에서 "이 사이트는 정규 URL 관리를 제대로 안 하고 있구나"라는 신호를 줄 수 있다
- 크롤 예산을 낭비한다. 301 을 처리하고 최종 URL 을 다시 타고 가는 과정이 추가되기 때문
물론 구글이 대놓고 패널티를 준다고 명시하지는 않는다. 다만 GSC 에서 "제출된 URL 리디렉션" 경고가 쌓이면 사이트 전체 건강도 지표에서 마이너스 시그널로 잡히고, 이게 쌓이면 우선순위 크롤링에서 밀린다.
수정 내용: sitemap-index.xml.ts 에서 해당 경로 제외
파일은 src/pages/sitemap-index.xml.ts였다. 이 파일은 사이트맵 인덱스를 동적으로 생성하는 역할을 한다. 정적 XML 파일이 아니라 TypeScript 로 빌드 타임에 URL 목록을 조합해서 뱉는 구조다.
수정 방향은 단순했다. /terms/ 경로를 URL 목록에서 필터링해서 제외하는 것. 거창한 로직 변경이 아니라, 해당 경로를 명시적으로 건너뛰도록 처리했다.
// 예시: 리디렉션 경로를 사이트맵에서 제외하는 패턴
const EXCLUDED_PATHS = ['/terms/']
const filteredUrls = allUrls.filter(
(url) => !EXCLUDED_PATHS.some((excluded) => url.pathname === excluded)
)
실제 코드는 이보다 조금 더 구체적인 형태였지만, 핵심 아이디어는 위와 같다. 리디렉션되는 URL 을 명시적으로 제외 목록에 올리고, 생성 단계에서 걸러내는 것.
왜 이렇게 하냐면, /terms/ 자체를 없애거나 리디렉션을 제거하는 건 이 맥락에서 옳은 방향이 아니다. /terms/ 로 접근하는 사용자나 외부 링크가 있을 수 있고, 리디렉션 자체는 UX 상 유효하다. 문제는 사이트맵이 그 URL 을 "정규 색인 대상"으로 제안하고 있다는 점이다. 사이트맵에는 최종 목적지 URL 만 들어가야 한다.
GSC 위생 규칙이라는 관점
"GSC 위생"이라는 표현을 커밋 메시지에 그대로 썼는데, 이건 팀 내에서 쓰는 표현이다. 구글 색인 관리를 위한 일종의 housekeeping 작업들을 묶어서 부르는 말이다.
위생 규칙의 기본 골자를 정리하면 이렇다:
| 항목 | 규칙 |
|---|---|
| 사이트맵 URL | 200 응답하는 정규 URL 만 포함 |
| 301 URL | 사이트맵에서 제외, 최종 URL 로 교체하거나 아예 뺌 |
| noindex 페이지 | 사이트맵에 넣지 않음 |
| canonical 불일치 | 사이트맵 URL 과 canonical 태그 URL 이 동일해야 함 |
| 404/410 | 즉시 제거 |
이 규칙들은 구글 공식 문서에도 나와 있지만, 실제로 사이트를 운영하다 보면 의외로 구멍이 생긴다. 페이지 구조를 바꾸거나 URL 을 정리하면서 사이트맵 업데이트를 빠뜨리는 경우, 혹은 이번처럼 리디렉션을 추가했는데 사이트맵은 손을 안 댄 경우다.
/terms/ 케이스가 딱 그런 경우였다. 언젠가 이 경로를 리디렉션 처리했는데, 사이트맵 생성 로직에서 이걸 반영하지 않은 채 그대로 흘러온 것이다. 당장 큰 문제가 생기는 건 아니지만, GSC 리포트를 보면 계속 경고로 잡혀서 신경 쓰인다.
이런 작업을 따로 추적하는 이유
이런 종류의 수정은 규모가 작아서 자칫 커밋 히스토리에서 묻힐 수 있다. 그래서 커밋 메시지에 "(GSC 위생룰)"이라는 태그를 명시적으로 달았다. 나중에 SEO 관련 작업 내역을 찾을 때 필터링하기 쉽게 하려는 목적이다.
사이트맵 관련 문제는 배포 직후에 바로 티가 나지 않는다. GSC 가 재크롤링하고, 색인 상태가 업데이트되고, 리포트에 반영되기까지 며칠에서 몇 주가 걸린다. 그래서 "이게 맞는 수정이었나?"를 검증하는 사이클이 길다. 이런 긴 피드백 루프 때문에 작업 내용을 명확하게 기록해두는 게 중요하다. 두 달 뒤에 GSC 리포트를 보면서 "이 경고가 왜 없어졌지?"라고 역추적할 때 커밋 히스토리가 유일한 단서가 된다.
sitemap-index.xml.ts 가 동적 생성 방식이라는 점도 중요한 포인트다. 정적 XML 을 직접 편집했다면 이번 수정 하나로 끝이겠지만, 코드로 생성하는 구조이기 때문에 제외 경로 관리 로직을 코드 레벨에서 명시적으로 박아두는 게 낫다. URL 구조가 바뀌거나 리디렉션이 추가될 때마다 사이트맵 파일을 손으로 건드리는 건 관리 포인트를 계속 늘리는 일이다.
이번 수정 이후로 GSC 에서 /terms/ 관련 경고가 사라지는지 한 2~3주 후에 확인할 예정이다. 아마 "리디렉션으로 제출된 URL" 항목에서 해당 경로가 빠질 것이고, 그러면 사이트맵 커버리지 리포트도 조금 깔끔해질 거다.
사이트맵 위생 작업은 눈에 안 띄지만, 쌓이면 티가 난다. 이런 잡일성 수정을 게을리하지 않는 게 장기적으로 크롤 효율을 지키는 방법이라고 생각한다.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.