중복 URL은 왜 생기나
의도해서 만드는 경우는 거의 없습니다. 대부분 구조상 자연히 생깁니다.
| 원인 | 예시 |
|---|---|
| 프로토콜 | http:// 와 https:// |
| www | www. 있는 주소와 없는 주소 |
| 끝 슬래시 | /page 와 /page/ |
| 대소문자 | /Page 와 /page |
| 추적 파라미터 | ?utm_source=... |
| 정렬·필터 | ?sort=price |
사람에게는 다 같은 페이지지만 검색엔진에게는 서로 다른 주소입니다. 그대로 두면 같은 내용이 여러 번 색인되고 신호가 흩어집니다.
canonical은 무엇을 하나
각 페이지가 "이 내용의 대표주소는 여기다"라고 선언하는 태그입니다.
<link rel="canonical" href="https://example.com/page">
검색엔진은 이걸 참고해 여러 주소를 하나로 묶습니다. 다만 지시가 아니라 힌트입니다. 다른 신호와 어긋나면 무시될 수 있습니다.
기본 규칙
자기 자신을 가리킨다
색인 대상 페이지는 모두 자기 자신을 가리키는 canonical을 갖는 것이 기본입니다. 이러면 파라미터가 붙은 변형이 생겨도 원본이 대표임이 분명해집니다.
절대주소로 쓴다
상대주소는 해석이 어긋날 수 있습니다. 프로토콜과 도메인을 포함한 절대주소로 씁니다.
여러 신호를 일치시킨다
canonical만 맞추면 부족합니다. 이 넷이 같은 주소를 가리켜야 합니다.
- canonical 태그
- sitemap에 넣은 주소
- 내부 링크가 거는 주소
- OG 태그의 og:url
하나라도 어긋나면 검색엔진이 어느 쪽을 믿을지 흔들립니다.
흔한 실수
전 페이지가 홈을 가리킴 — 템플릿에 canonical을 한 줄 박아두고 변수를 안 넣은 경우입니다. 모든 페이지가 "대표는 홈"이라고 말하니 개별 페이지가 색인에서 사라집니다.
noindex와 함께 씀 — "색인하지 마라"와 "이게 대표다"를 동시에 보내는 모순입니다. 어느 쪽이 이길지 예측하기 어렵습니다.
리디렉션되는 주소를 가리킴 — canonical이 가리키는 주소가 다시 다른 곳으로 튀면 신호가 끊깁니다.
자바스크립트로 넣음 — 실행 전에 읽히면 없는 것과 같습니다. 첫 응답 HTML에 들어 있어야 합니다.
canonical만으로 부족한 경우
canonical은 힌트일 뿐이라, 구조적인 중복은 301 리디렉션으로 정리하는 편이 확실합니다.
http→httpswww있음 ↔ 없음 (한쪽으로 통일)- 끝 슬래시 (한쪽으로 통일)
- 대문자 → 소문자
이건 서버에서 처리하고, canonical은 파라미터처럼 리디렉션할 수 없는 변형에 씁니다.
확인 방법
페이지 소스를 열어 canonical 값을 확인하고, 그 주소를 브라우저에 붙여 넣어 리디렉션 없이 200으로 열리는지 봅니다. 그리고 sitemap과 내부 링크의 주소가 같은지 대조합니다.