Canonical 태그가 언어를 넘어설 때 Hreflang이 끊어집니다
Canonical이 영어 버전을 가리키는 현지화 페이지는 자체 hreflang 주석을 취소하고, 브라우저 검사에서도 이를 확인할 수 없습니다. 모순을 포착하는 검사에 대한 감사 데이터와 우리 자체 9 로케일 접두사가 그 중 하나를 실패한 날.
페이지는 같은 에 2 태그를 담을 수 있습니다.<head> that address the same crawler about the same URL and say opposite things. On 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 자기 참조, 현재 데이터에서 58%의 88 hreflang 평가가 여전히 실패합니다. 사이트는 그 루프를 닫고 모든 자기 참조를 올바르게 처리하며, 여전히 각 현지화 페이지가 영어 쌍으로 교체되도록 요청할 수 있습니다.
교차 언어 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 존재 | 홈페이지는 URL를 전혀 선언하지 않음 | 29% of 49 사이트 |
방법론: 도메인별 최신 완료 감사 스냅샷, engine-v2 체크셋, 약 5월 23 – August 31, 2026, 익명화. 지표는 체크마다 다르며 — 34 to 49 사이트 — 입력이 존재할 때만 체크가 실행되기 때문입니다: 자체 참조 체크는 hreflang 주석이 전혀 없는 홈페이지에 대해 판결을 내리지 않으므로, 그 사이트 수가 더 적습니다. 평가 수준과 사이트 수준 비율은 일부 도메인이 창간 기간에 두 번 이상 감사되었기 때문에 다릅니다. 샘플은 자체 선택된 것으로, 감사를 수행한 소유자들이며 소규모에서 중간 규모로 편향되어 있으므로, 비율을 해당 세그먼트에 대한 방향성으로 간주하십시오. 두 번째 행은 더 조용한 위험. canonical이 없는 페이지는 hreflang 주석과 모순되지 않았지만, 주석을 방어하지도 않았습니다: 페이지에 URL가 권위 있다고 명시하는 내용이 없으므로, 1개 이상의 주소에서 접근 가능한 로케일 변형은 전적으로 추론에 의해 해결됩니다. 올바른 클러스터에 도달하려면 먼저 canonical 위생을 거쳐야 하므로, 우리의 canonical 가이드가 hreflang 구현 가이드의 전제 조건이며, 동반 가이드는 아닙니다.
모순은 클러스터 양쪽 끝에서만 보입니다
단일 페이지는 자신에 대한 이 실패를 보고할 수 없습니다. /fr/pricing는 내부적으로 일관됩니다 — hreflang 세트, canonical, 둘 다 잘 형성됨 결함은 주석과 주석이 달린 페이지를 나란히 보았을 때 나타나므로, 우리의 감사는 문서를 읽는 대신 클러스터를 가져옵니다1.
각 실행은 홈페이지의 hreflang 주석을 파싱하고, 그 주석에서 최대 12개의 동일 사이트 대상 URL을 가져오며, 홈페이지 자체가 도메인 외부에 있을 경우 해당 단계를 완전히 건너뜁니다. 왜냐하면 그 주석은 외부 사이트의 HTML에서 왔기 때문입니다. 콘텐츠를 반환하는 각 대상에 대해 엔진은 상태 코드, 요청이 리디렉션되었는지, noindex 지시문이 있는지, 대상 자체 canonical이 주석이 명시한 URL를 해결하는지 기록합니다. 거기에서 불일치가 기록되면 canonical_mismatch로 기록되고 고위험 체크를 실패합니다 — 그 체크는 교차 언어 canonical 포착입니다 URL은 끝에 슬래시가 붙고 대소문자를 정규화하여 비교되므로 /fr/pricing와 /FR/pricing/는 1페이지이며, 더 작은 차이는 차이로 처리되지 않는다.
두 번째 검사는 페이지가 lang 속성에 선언한 언어와 해당 페이지가 자신의 hreflang 주석에서 주장하는 로케일을 주요 서브태그 기준으로 비교하며, 감사 대상 페이지 중 일부가 자신에 대해 hreflang을 선언한 경우에만 수행된다. 어디에도 자기 참조 주석이 없는 사이트는 감사가 볼 때 단일 언어이며, 검사는 통과 대신 그 사실을 보고한다.
대체 페이지를 가져올 수 없을 때는 실패 대신 결론이 불확정이며, 보고서는 실제로 평가된 선언된 대상 수를 표시한다. 접근 불가 대체 페이지는 증거의 공백이며, 이를 결함으로 보고하는 것은 새로운 결함을 만드는 것이다.
우리 자체 로케일 접두사는 영어를 제공했으며 August 17, 2026까지
이러한 검사는 seoreport.dev에서 이 유형의 결함을 실패했기 때문에 존재한다. Ahrefs Site Audit은 우리 사이트에서 184개의 URL에 걸쳐 hreflang과 HTML lang 불일치를 보고했다. lang 속성은 증상이며, 내용은 모든 9개의 로케일 접두사에서 영어였으며, 이는 각 현지화된 URL가 영어 쌍의 중복이 되도록 만들었다 — 교차 언어 정규화가 다른 방향에서 도달한 동일한 결과.
원인은 1 함수 경계. 문서 쉘은 window가 정의되지 않을 때 기본 언어를 반환하는 헬퍼에서 언어를 가져왔다. 서버에서는 /fr/pricing가 lang="en"를 렌더링하고 영어 번역 번들을 시드했으며, 헤드 링크를 내보내는 컴포넌트는 경로를 읽고 런타임이 아니라 정확한 fr self-hreflang을 바로 옆에 내보냈다. 클라이언트 효과가 하이드레이션 후 언어를 전환했으므로 모든 브라우저 기반 검사는 통과했고 인간은 이를 보지 못했다. 크롤러는 그 효과를 실행하지 않는다.
August 17, 2026에서 수정: 쉘은 경로에서 언어를 유도하고, 현지화된 레이아웃은 로더에서 로케일 번들을 해결하여 서버 렌더와 하이드레이션이 공유하도록 하며, 번들이 없는 지원되는 로케일은 조용히 영어를 제공하는 대신 예외를 발생시킨다. 텍스트 방향도 잘못되었으며 — 아랍어는 ltr를 제공했다.
게이트는 HTML 연기만으로 실행되는 원시 스모크이며, JavaScript가 없으며, 브라우저 검사는 이 전체 실패 클래스를 무시합니다. 프로덕션에서 red-first를 실행하면 440 실패가 128 지역화된 URL에서 보고되었으며, 모든 페이지는 100% 영어 캐리오버를 가집니다. 수정된 빌드에서는: 0 실패가 144 URL에서 발생했습니다. 엔진의 언어 대 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.dev의 9 지역 접두사는 이제 통과하며, 이는 우리가 결함을 먼저 배송했기 때문이며, 전체 제품이 이를 찾는 사이트에서 통과합니다.
사이트 순위 확인하기
실행 가능한 인사이트와 우선 순위 수정을 포함한 무료 AI 기반 SEO 보고서를 받아보세요.
가입 필요 없음.