언어를 초월하는 Canonical 태그가 있을 때 Hreflang이 끊어집니다
Canonical이 영어 버전을 가리키는 현지화 페이지는 자체 hreflang 주석을 취소하며, 브라우저 검사에서도 이를 확인할 수 없습니다. 모순을 포착하는 검사에 대한 감사 데이터와 우리 자체 9 로케일 접두사가 실패한 날짜.
한 페이지는 같은 <head> 안에 같은 URL에 대해 같은 크롤러에게 정반대의 말을 하는 2 개의 태그를 가질 수 있습니다. https://example.com/fr/pricing에서, 이 문장은 페이지가 클러스터의 프랑스어 멤버임을 말합니다:
<link rel="alternate" hreflang="fr" href="https://example.com/fr/pricing" />
그리고 아래의 1 라인은 페이지가 영어 원본에 포함되어야 할 변형임을 나타냅니다:
<link rel="canonical" href="https://example.com/pricing" />
실제 사이트는 동일한 템플릿에서 모든 현지화 경로에 대해 둘 다 제공하며. 이는 7월에 문서화한 실패 이후 남은 실패이며 — 누락된 hreflang 자기 참조, 현재 데이터에서 88개의 hreflang 평가 중 58%가 여전히 실패합니다. 사이트는 그 루프를 닫고 모든 자기 참조를 올바르게 설정한 뒤에도 각 현지화 페이지가 영어 쌍으로 교체되도록 요청할 수 있습니다.
언어를 초월하는 Canonical은 Google 에게 현지화된 URL 을 원본에 포함하도록 요청합니다
Canonical 태그는 통합 요청입니다: 이 URL 을 그 하나의 변형으로 취급하고 그 하나를 색인합니다. hreflang 주석은 라우팅 주장입니다: 이 URL 은 해당 언어 버전입니다. 서로 다른 URL을 가리키면 사이트는 자체 주장을 무효화하는 요청을 발행한 것이며 — 클러스터의 프랑스어 슬롯은 자신을 부인하는 페이지로 채워집니다.
Google 은 hreflang이 지시가 아니라 힌트임을 명시했으며, Canonical화도 동일한 방식으로 작동합니다: 사이트가 신호를 제공하고 Google 이 이를 해결합니다. 그 해결이 전체 문제입니다. 자기 Canonical 현지화 페이지가 있으면 퍼블리셔가 프랑스어 검색자를 위해 어떤 URL 을 제공할지 결정합니다. 언어를 초월하는 Canonical이 있으면 퍼블리셔는 결정을 맡기면서 클러스터가 구성된 것으로 믿으며, 이후 보고되는 결과는 자체 시장에서 순위가 없는 현지화 페이지와 영어 페이지가 그 자리에 나타나는 것입니다.
이들을 생성하는 것은 평범한. 요청 경로가 아니라 경로 정의에서 만든 Canonical 헬퍼는 모든 로케일에 대해 접두어가 없는 URL 을 발행합니다. hreflang 설정이 로케일별이지만 Canonical 설정이 전역인 CMS도 동일하게 동작합니다. 그래서 URL에 로케일 접두사를 추가하고 원래 콘텐츠가 있던 위치를 가리키는 canonical을 그대로 두는 마이그레이션이 발생했습니다. 각 경우에 페이지는 완벽하게 렌더링되고, 주석은 view-source에서 완전하게 보이며, 모순은 2 속성에서 벗어납니다.
데이터셋
| hreflang 자체 참조가 존재함 | 홈페이지는 자체 hreflang 주석에서 제외됨 | 58% of 88 평가; 59% of 34 사이트 |
| 홈페이지 canonical 존재 | 홈페이지는 전혀 canonical URL을 선언하지 않음 | 29% of 49 사이트 |
방법론: 현재 체크셋에서 도메인별 최신 완료 감사 스냅샷, 약 5월 23 – August 31, 2026, 익명화됨. 분모는 체크마다 다르며 — 34 to 49 사이트 — 입력이 존재할 때만 체크가 실행되기 때문입니다: 자체 참조 체크는 hreflang 주석이 전혀 없는 홈페이지에 대해 판결을 내리지 않으므로, 그 사이트 수가 더 적습니다. 평가 수준과 사이트 수준 비율은 일부 도메인이 창간 기간에 두 번 이상 감사되었기 때문에 다릅니다. 샘플은 자체 선택된 것으로, 감사를 수행한 소유자이며 소규모에서 중간 규모로 편향되어 있으므로 해당 세그먼트에 대한 비율을 방향성으로 간주하십시오.
두 번째 행은 더 조용한 위험입니다. canonical이 없는 페이지는 hreflang 주석과 모순되지 않았지만, 주석을 방어하지도 않았습니다: 페이지에 어떤 URL이 권위 있다고 명시되어 있지 않으므로, 1개 이상의 주소에서 접근 가능한 로케일 변형은 완전히 추론에 의해 해결됩니다. 올바른 클러스터에 도달하려면 먼저 canonical 위생을 거쳐야 하므로, 우리의 canonical 가이드가 hreflang 구현 가이드의 전제 조건이며, 보조 자료가 아닙니다.
모순은 클러스터 양쪽 끝에서만 보입니다
단일 페이지는 자신에 대한 이 실패를 보고할 수 없습니다. /fr/pricing는 내부적으로 일관되어 보입니다 — hreflang 세트, canonical, 둘 다 잘 형성됨. 결함은 주석과 주석이 달린 페이지를 나란히 보았을 때 나타나므로, 이를 확인하려면 1 문서만 읽는 것이 아니라 클러스터 전체를 가져와야 합니다.
각 hreflang 주석을 대상까지 따라가서 돌아오는 내용을 기록하십시오: 상태 코드, 요청이 리디렉션되었는지 여부, noindex 지시문이 있는지 여부, 그리고 대상 자체의 canonical이 주석이 가리킨 URL을 지정하는지 여부입니다. canonical이 다른 URL을 지정하는 대상이 바로 이 글에서 다루는 교차 언어 canonical입니다.
lang 속성은 두 번째 증인입니다. html lang이 자신의 hreflang 항목이 주장하는 로케일과 다른 언어를 지정하는 페이지는 같은 방식으로 스스로 모순되며, 이는 현지화된 경로가 원본의 콘텐츠를 제공하고 있다는 첫 번째 가시적 신호인 경우가 많습니다.
가져올 수 없는 대체 페이지는 증거의 공백이지, 결함의 증거가 아닙니다. 이를 미확인으로 기록하고, 클러스터가 깨졌다고 판단하기 전에 다시 시도하십시오.
Diagram source
graph TD
FR["/fr/pricing — html lang=fr"]
EN["/pricing — 영어 원본"]
FR -->|"hreflang=fr, self-referencing"| CLAIM["주장: 이 URL를 프랑스어 검색자에게 제공한다"]
FR -->|"rel=canonical"| EN
EN -->|"hreflang=fr"| FR
CLAIM --> Q{"프랑스어 쿼리에 어떤 URL가 답합니까?"}
EN --> Q
Q -->|"사이트가 결정 중단"| OUT["Google 선택 — 보통 영어 URL"]우리 자체 로케일 접두사는 영어를 제공했으며 August 17, 2026까지
우리 자신도 seoreport.dev에서 이 유형의 결함으로 실패했습니다. Ahrefs Site Audit은 우리 사이트의 184개 URL에서 hreflang과 HTML lang 불일치를 보고했다. lang 속성이 증상이었다; 내용은 모든 9개 로케일 접두사에서 영어였으며, 이는 각 현지화된 URL가 영어 쌍의 중복이 되도록 만들었고, 이는 다른 방향에서 도달한 교차 언어 canonical과 동일한 결과를 낸다.
원인은 1 함수 경계. 문서 쉘은 window이 정의되지 않을 때 기본 언어를 반환하는 헬퍼에서 언어를 가져온다. 서버에서는 /fr/pricing가 lang="en"를 렌더링하고 영어 번역 번들을 시드했으며, head 링크를 발행하는 컴포넌트는 경로를 읽고 런타임이 아니라, 정확한 fr self-hreflang을 바로 옆에 발행했다. 클라이언트 효과가 하이드레이션 후 언어를 전환했으므로 모든 브라우저 기반 검사는 통과했고 인간은 이를 보지 못했다. 크롤러는 그 효과를 실행하지 않는다.
August 17, 2026에서 수정: 쉘은 경로에서 언어를 유도하고, 현지화된 레이아웃은 로더에서 로케일 번들을 해결하여 서버 렌더와 하이드레이션이 공유하도록 하며, 번들이 없는 지원되는 로케일은 조용히 영어를 제공하는 대신 예외를 발생시킨다. 텍스트 방향도 잘못되었으며 — 아랍어는 ltr를 제공했다.
회귀 테스트는 JavaScript 없이 원시 HTML을 대상으로 실행합니다. 브라우저 검사는 이 전체 실패 클래스를 보지 못하기 때문입니다. 프로덕션에 red-first를 실행하면 440 실패가 128 지역화된 URL에서 보고되었으며, 모든 페이지는 100% 영어 캐리오버를 가집니다. 고정 빌드에 대해: 0 실패가 144 URL에서 발생했습니다. lang과 hreflang을 비교했다면 가장 먼저 실패했을 사이트는 우리 사이트였습니다.
x-default는 대체 페이지가 선언한 것을 그대로 상속합니다.
x-default를 선언하는 사이트 샘플이 너무 작아 실패율을 발표할 수 없습니다. 또한 HTML이 증명하는 것은 보기보다 적습니다: x-default 주석이 선언되었다는 사실은 보여 주지만, 게시자가 어떤 청중에게 제공하려 했는지는 보여 주지 않습니다. 확인 가능한 것은 인접한 사실들 — URL 모양, 대상 건강, 상호 주석, 정규화 정렬 — 입니다.
메커니즘이 의미하는 바는 어쨌든 명시할 가치가 있습니다. x-default는 사이트가 제공하지 않는 언어를 가진 검색자에게 대체값으로 사용되므로, 일반적으로 기본 시장 페이지를 가리킵니다. 그 페이지가 교차 언어 정규화를 포함하면, 행성상의 모든 일치하지 않는 검색자에게 대체값이 모순을 상속하며, 그 모순은 x-default 줄 자체가 아니라 대상의 건강 상태에서 드러납니다.
원시 HTML에서, 지역별로, 양방향으로 확인하십시오.
크롤러가 하는 방식으로 페이지를 가져오고 3 항목을 읽습니다:
curl -s -A "Googlebot" https://example.com/fr/pricing | grep -iE '<html|rel="canonical"|hreflang'
lang 속성, 자기 참조 hreflang 항목, 그리고 정규화는 1개 지역과 1개 URL에서 일치해야 합니다:
<!-- On https://example.com/fr/pricing --><html lang="fr"><link rel="canonical" href="https://example.com/fr/pricing" /><link rel="alternate" hreflang="en" href="https://example.com/pricing" /><link rel="alternate" hreflang="fr" href="https://example.com/fr/pricing" /><link rel="alternate" hreflang="x-default" href="https://example.com/pricing" />
그런 다음 지역당 1개 페이지에서 반복하고, 주석이 명명한 모든 URL을 가져와 각 주석이 자신에게 정규화되는지 확인합니다. 규칙은 개발자에게 전달하기에 충분히 짧습니다: hreflang 클러스터의 모든 구성원은 자신에게 정규화됩니다. 교차 언어 정규화는 정확히 1가지 상황에서만 올바릅니다 — 지역화된 URL이 전혀 지역화되지 않았고 원본과 동일한 언어를 제공할 때 — 이 상황에서 URL은 클러스터에 속하지 않습니다.
Search Console의 URL 검사기는 실제로 선택된 Google의 권위 있는 두 번째 의견을 제공합니다, 각 URL마다. 유료 SEOReport 진단은 클러스터 전체에 걸쳐 이 루프를 실행하고, 모순되는 각 쌍을 발견된 페이지와 함께 나열합니다. seoreport.dev의 9 지역 접두사는 이제 통과하며, 우리는 결함을 먼저 배송했기 때문에 통과합니다, 전체 제품이 이를 찾는 사이트에서.