x-default missing or pointing at a redirect

The annotation set lists English, German and French. A visitor from Finland searches in Finnish, matches none of them, and lands on whichever page the search engine decided was most likely — often the wrong one, and inconsistently across queries.

The x-default entry exists to make that decision yours. It is one line, it is frequently omitted, and when it is present it very often points at the one URL on the site that cannot serve it: the root, which redirects by language.

Choosing the x-default destination The x-default entry names where a reader whose language matches none of the alternatives should land. A language selector is the strongest option because it lets the reader choose. The default locale page is a reasonable fallback. Declaring nothing leaves the choice to the search engine. Declaring several x-default entries is invalid. Who is the x-default entry for? A reader whose language matches no alternative Finnish visitor, en/de/fr site A language selector lets them choose The default locale page a reasonable guess Nothing declared the engine guesses for you Every locale as x-default invalid — one per group
The fourth branch is a real configuration people ship — the annotation set is then partly ignored.

Root cause: x-default names a destination, not a language

Every other entry in an annotation set maps a language to a URL. x-default maps the absence of a match to a URL. It is the answer to “none of these apply to this reader — now what?”, and its target therefore has to be something that works for a reader of any language.

That requirement is what makes the obvious choice wrong. The natural destination is the site root, and on most localized sites the root is precisely the URL that performs language detection and redirects. A crawler following the annotation is redirected to one language, so the entry resolves to a language-specific page rather than to a neutral one, and the annotation is either discarded or effectively duplicates one of the language entries.

The second common failure is simply not having one. Without an x-default the set is still valid, and unmatched readers are routed by whatever heuristic the search engine applies — usually the language whose region best matches the reader’s location, which for a global product is a guess with no relationship to what the reader can read.

Four x-default misconfigurations and their effects An absent x-default leaves unmatched readers routed by search-engine guesswork. An entry pointing at a redirecting URL is discarded. More than one entry makes the group inconsistent. And an entry pointing at a URL that itself performs language detection means crawlers only ever see one language there. Four ways x-default is misconfigured Effect Missing entirely unmatched readers are routed by guesswork Points at a redirect the entry is discarded with the redirect Several entries the group is treated as inconsistent Points at a locale-detecting URL crawlers see one language and index one
The last row is the trap: the natural destination for x-default is often the very URL that redirects.

Minimal reproducible example

<!-- Every localized page emits this set -->
<link rel="alternate" hreflang="en-GB" href="https://example.com/about" />
<link rel="alternate" hreflang="de-DE" href="https://example.com/de/about" />
<link rel="alternate" hreflang="fr-FR" href="https://example.com/fr/about" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />

The last line points at the site root. Requesting it with a German Accept-Language header returns a 302 to /de/, so the annotation does not resolve to a neutral destination — and it points at the home page rather than at the equivalent of the page being annotated.

The fix: a neutral destination that answers 200

Two arrangements work, and the choice depends on whether the site has a selector.

If it does, the selector is the strongest destination: it serves any reader, makes no assumption about their language, and gives them a real choice. It must be a URL that never redirects by language.

<link rel="alternate" hreflang="x-default" href="https://example.com/choose-language" />

If it does not, use the default locale’s version of the same page rather than the site root. The reader at least lands on the content they were looking for, in the language most likely to be understood as a second language for that product.

<!-- On every page in the /about group -->
<link rel="alternate" hreflang="x-default" href="https://example.com/about" />

The second form has a further advantage: because it is the same URL as the default locale’s entry, there is nothing extra to keep in sync — the generator emits the same string twice, with different hreflang values.

Four rules for a working x-default entry Each page group names exactly one x-default destination, either a language selector or the default locale page. That URL must answer 200 to every visitor without redirecting by language. The entry appears on every page in the group alongside the language entries, and it is identical everywhere so reciprocity holds. Making x-default do its job 1 Pick one destination per page group selector, or the default locale 2 Make that URL return 200 to everyone no language-based redirect on it 3 Emit it in every page of the group alongside the language entries 4 Keep it identical across the group reciprocity applies to x-default too
Rule two conflicts with the redirect most sites want on their root — which is why the selector wins.

Keeping the root redirect and the annotation compatible

The tension is real: the root redirect is good for readers and bad for the annotation. Three resolutions are worth knowing.

Do not annotate the root at all. Annotation sets are per page group, and the root is one group among many. Pointing x-default at the default locale’s version of each page keeps every group internally consistent and leaves the root free to redirect.

Serve a selector at a distinct URL. A dedicated language-choice page that never redirects is a clean destination for x-default across every group, and it is genuinely useful to readers who arrive with the wrong language.

Redirect the root only for browsers. Some teams exempt crawler user agents from the root redirect. This works, and it is the least appealing option, because serving different responses to crawlers than to readers is a pattern with a bad history and a narrow margin between “reasonable” and “cloaking”.

The first is usually right, and it costs nothing: it is a change in what the generator emits, not a change in behaviour for any reader.

Verification

# The x-default target must answer 200 with no language redirect
curl -sI -H 'Accept-Language: de-DE' https://example.com/about | head -1
#   HTTP/2 200          ← not a 302

# Exactly one x-default per page, identical across the group
for p in "" de/ fr/; do
  curl -s "https://example.com/${p}about" | grep -c 'hreflang="x-default"'
done
#   1
#   1
#   1

The second check catches the duplicate-entry case, which arises when a generator emits x-default per locale rather than per group — a plausible bug that produces three entries on every page and invalidates the set.

When to escalate

If unmatched readers still land unpredictably after the entry is correct, remember that x-default is a preference rather than a guarantee: search engines weigh it against their own signals, and a strong regional signal can outweigh it. Consistency across the whole site helps more than any single page’s annotation.

If the entry is discarded in reporting tools despite answering 200, check the URL form. x-default is subject to the same exact-match requirement as every other entry, so a trailing-slash or host mismatch discards it — the same class of failure covered in locale-aware SEO and hreflang.

If a selector page is the destination, make sure it is genuinely crawlable and not a script-rendered widget. A destination that renders nothing without JavaScript is a destination a crawler cannot evaluate.

Designing a selector page worth pointing at

If the x-default destination is a language selector, that page is now doing real work for readers who arrived confused, and it deserves more than a list of links.

Three properties make one effective. It should name each language in that language — “Deutsch”, not “German” — because a reader who cannot read your default language cannot read the English name of their own. It should preserve the page the reader was trying to reach, carrying the requested path through as a parameter so choosing a language lands them on the right content rather than on a home page. And it should record the choice, so the selector is a one-time interruption rather than a recurring one.

It should also be genuinely static. A selector that renders its options from an API call is a selector that shows nothing to a crawler and nothing to a reader on a slow connection, which defeats both of the audiences it exists for. The locale list is known at build time; the page should be too.

One further detail matters for the annotation to hold: the selector must not itself redirect. It is tempting to add a convenience that detects the reader’s language and forwards them automatically — which turns the one URL guaranteed to be neutral into another language-detecting endpoint, and puts you back where this page started.

FAQ

Is x-default required?

No, and a set without it is valid. It is worth having because the alternative is letting a heuristic choose for readers you have no other signal about, and on a product with more markets than locales that is a meaningful share of visitors.

Can x-default point at a page in a specific language?

Yes — it usually does, since most sites do not have a language selector. What it means is “this is the best default for someone we cannot match”, not “this page is language-neutral”. Choosing the default locale’s version of the same page is the normal answer.

Should every page group have its own x-default?

Yes. The annotation set is per group, and an x-default pointing at the home page from a deep content page sends unmatched readers away from the content they were looking for. Point it at the default locale’s version of that same page.

Does x-default affect readers who do match a language?

No. It is consulted only when no language entry matches. A German reader with a German alternative available never sees it, which is also why a broken x-default can sit unnoticed for a long time on a site whose traffic comes mostly from its supported markets.

How does x-default interact with a country-based redirect?

Badly, if the country redirect runs on the x-default destination. A country redirect is a different decision from a language one — it routes by where the request came from rather than by what the reader can read — and applying it to the neutral destination reintroduces exactly the problem x-default exists to solve. If your product needs country routing, apply it to the localized pages and leave one URL exempt.

Can a subdomain or country domain be the x-default?

It can, and on a multi-domain setup it often is: a global .com serving English alongside de.example.com and fr.example.com makes a natural neutral destination. The rules do not change — the target must answer 200 without redirecting by language, and it appears once per page group.

Part of Locale-Aware SEO & hreflang.