Troubleshooting guide · technical-seo · Published 2026-08-16 · 3 min read
hreflang edge cases and validation
hreflang edge cases: x-default fallback, self-reference and reciprocity, region code rules, canonical clashes, and non-HTML files.
- ·Self reference and reciprocity
- ·x-default fallback
- ·Canonical conflict
The two rules that break clusters
The basics introduced the tags. The hardest failures in practice come down to two non-negotiable rules:
- Self-reference: each language version must list itself among its alternates.
link rel="alternate" hreflang="en" href="https://example.com/en/"must include the page's own URL with its own language value. - Reciprocity: if page A points to page B, page B must point back to page A. A one-way link makes Google ignore the whole pair. "If two pages don't both point to each other, the tags will be ignored" is the documented outcome.
These two rules alone cause a large share of "hreflang has no errors but does nothing" reports, because both failures silently drop whole clusters rather than surface an error.
x-default and the fallback
x-default is not a language code; it is a reserved value pointing at the page Google should show when no other hreflang tag matches the user's locale or region. The common target is a language selector or the default-region homepage. Two points:
- Missing
x-defaultdoes not break the cluster the way a missing reciprocal tag does; Google falls back to its own detection. But it is often the most-missed element and worth adding. - Point
x-defaultat the page you actually want third-country visitors to land on, not at whomever it would resolve to by accident. If the root is a language gateway, that is the right target.
Region codes versus language codes
- A bare language code (
en,de,fr) means "any region, this language". - Language plus region (
en-GB,en-US,pt-BR) targets a specific locale. Use the combined form only when you genuinely serve different content to different countries sharing a language. - A region alone (
hreflang="GB",hreflang="UK") is invalid. The region must be paired with a language.UKis not a valid ISO 3166-1 alpha-2 code, soen-GBis the correct form.
Canonical conflict silently overrides hreflang
If the canonical tag on a page points to a different URL than the hreflang annotation specifies, Google follows the canonical and ignores the hreflang. The rule: every page referenced in an hreflang set needs a self-referencing canonical, and the URLs in the hreflang tags should match the canonicals character for character (protocol and trailing slash included). The canonicalisation edge cases guide covers the wider conflict patterns this belongs to.
Non-HTML documents
For a PDF or other non-HTML resource, the language block cannot live in the document head. Use an HTTP Link header on the response:
Link: <https://example.com/en/report.pdf>; rel="alternate"; hreflang="en", \
<https://example.com/de/report.pdf>; rel="alternate"; hreflang="de", \
<https://example.com/report.pdf>; rel="alternate"; hreflang="x-default"
The same self-reference and reciprocity rules apply to header-based alternates.
Pick one delivery method
HTML <link> in the head, HTTP Link headers, and xhtml:link entries in an XML sitemap are all valid and treated as equivalent by Google, but mixing them on one URL is a common source of inconsistency. Choose a single source of truth per URL and prefer the sitemap route when you manage many URLs at scale; build it from a single data source and validate the rendered head output rather than trusting view-source alone, since rendering can alter the final tags. Audit your Search Console international targeting periodically so a silent cluster drop does not go unnoticed.