Hreflang

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

Use hreflang statements to solve the duplicate content problem when having multiple pages with similar content that target different audiences.

Only within the same site

Update (2023.03): hreflang only works for solving duplicate content issues within a site - It doesn't work across multiple sites.

How it works

  • Put hreflang statements in the head of all related pages
  • You only need one hreflang-statement, that can be applied to all pages: A hreflang statement refers to both the other pages as well to the page on which it was included
  • This reciprocity is obligatory: If page A refers to page B, then page B has to refer to page A for the referral to be valid - Except for situations where there is only one self-referencing code (see separate chapter)
  • The hreflang tag uses ISO 639-1 Language codes (two letters) - ISO 31661-Alpha-2 Country codes (two letters)
  • Google chooses the optimal fit
  • The trailing / is as on [1]

Wrong example

This example is wrong, because hreflang statements are only relevant within a given site. Nevertheless, I kept it here, just because I link it's quite cool.

BTW: Some of the more 'specialistic' tags, were not recognised by a tool for creating hreflang statements, used by one of our marketing partners.

# When nothing fits
########################################
#
<link rel="alternate" href="https://example.com/"  hreflang="x-default" />


# Language-only
########################################
#
<link rel="alternate" href="https://voorbeeld.nl/"   hreflang="nl" />
<link rel="alternate" href="https://example.com/"    hreflang="en" />
<link rel="alternate" href="https://lexample.fr/"    hreflang="fr" />
<link rel="alternate" href="https://beispiel.de/"    hreflang="de" />
<link rel="alternate" href="https://ejemplo.es/"     hreflang="es" />


# Dutch Antilles + languages
########################################
#
# * Probably USD rather than EUR, hence example.us
# * There is no USD NL site - And that's fine
#
<link rel="alternate" href="https://voorbeeld.nl/"   hreflang="nl-an" />
<link rel="alternate" href="https://example.us/"     hreflang="en-an" />


# Europe + languages
########################################
#
# * Note that this might cause a mismatch for CH: They don't use euro. On the other
#   hand: They already have a more specific match
# * Unfortunately, there don't seem to be codes for other continents
#
<link rel="alternate" href="https://voorbeeld.nl/"  hreflang="nl-eu" />
<link rel="alternate" href="https://example.com/"   hreflang="en-eu" />
<link rel="alternate" href="https://lexample.fr/"   hreflang="fr-eu" />
<link rel="alternate" href="https://beispiel.de/"   hreflang="de-eu" />
<link rel="alternate" href="https://ejemplo.es/"    hreflang="es-eu" />


# Eurozone + languages
########################################
#
<link rel="alternate" href="https://voorbeeld.nl/"  hreflang="nl-ex" />
<link rel="alternate" href="https://example.com/"   hreflang="en-ex" />
<link rel="alternate" href="https://lexample.fr/"   hreflang="fr-ex" />
<link rel="alternate" href="https://beispiel.de/"   hreflang="de-ex" />
<link rel="alternate" href="https://ejemplo.es/"    hreflang="es-ex" />


# Metropolitan France + languages
########################################
#
<link rel="alternate" href="https://voorbeeld.nl/"   hreflang="nl-fx" />
<link rel="alternate" href="https://example.com/"    hreflang="en-fx" />
<link rel="alternate" href="https://lexample.fr/"    hreflang="fr-fx" />
<link rel="alternate" href="https://beispiel.de/"    hreflang="de-fx" />
<link rel="alternate" href="https://ejemplo.es/"     hreflang="es-fx" />


# Dutch language + countries
########################################
#
<link rel="alternate" href="https://voorbeeld.be/"   hreflang="nl-be" />
<link rel="alternate" href="https://voorbeeld.nl/"   hreflang="nl-ne" />


# English language + countries
########################################
#
<link rel="alternate" href="https://example.ch/"             hreflang="en-ch" />
<link rel="alternate" href="https://example.uk/"             hreflang="en-gb" />
<link rel="alternate" href="https://example.au/"             hreflang="en-au" />
<link rel="alternate" href="https://example.ca/"             hreflang="en-ca" />
<link rel="alternate" href="https://example-ireland.com/"    hreflang="en-ie" />
<link rel="alternate" href="https://example-nigeria.com/"    hreflang="en-ng" />
<link rel="alternate" href="https://example-portugal.com/"   hreflang="en-pt" />
<link rel="alternate" href="https://example-shop.at/"        hreflang="en-at" />
<link rel="alternate" href="https://example-shop.de/"        hreflang="en-de" />
<link rel="alternate" href="https://example-turkey.com/"     hreflang="en-tr" />
<link rel="alternate" href="https://example-ukraine.com/"    hreflang="en-ua" />
<link rel="alternate" href="https://example.be/"             hreflang="en-be" />
<link rel="alternate" href="https://example.cn/"             hreflang="en-cn" />
<link rel="alternate" href="https://example.com.es/"         hreflang="en-es" />
<link rel="alternate" href="https://example.cz/"             hreflang="en-cz" />
<link rel="alternate" href="https://example.dk/"             hreflang="en-dk" />
<link rel="alternate" href="https://example.fr/"             hreflang="en-fr" />
<link rel="alternate" href="https://example.in/"             hreflang="en-in" />
<link rel="alternate" href="https://example.it/"             hreflang="en-it" />
<link rel="alternate" href="https://example.jp/"             hreflang="en-jp" />
<link rel="alternate" href="https://example.lu/"             hreflang="en-lu" />
<link rel="alternate" href="https://example.nl/"             hreflang="en-nl" />
<link rel="alternate" href="https://example.nz/"             hreflang="en-nz" />
<link rel="alternate" href="https://example.pl/"             hreflang="en-pl" />
<link rel="alternate" href="https://example.se/"             hreflang="en-se" />
<link rel="alternate" href="https://example.sk/"             hreflang="en-sk" />
<link rel="alternate" href="https://example.us/"             hreflang="en-us" />


# French language + countries
########################################
#
<link rel="alternate" href="https://lexample.be/"   hreflang="fr-be" />
<link rel="alternate" href="https://lexample.ch/"   hreflang="fr-ch" />
<link rel="alternate" href="https://lexample.fr/"   hreflang="fr-fr" />


# German language + countries
########################################
#
<link rel="alternate" href="https://beispiel.de/"   hreflang="de-de" />


# Spanish language + countries
########################################
#
<link rel="alternate" href="https://ejemplo.es/"   hreflang="es-es" />

Generic matches

Hreflang statements exist for exact matches language-country, but also for generic matches, like language-any country. This can be useful if e.g., for all English visitors from countries for which there isn't a dedicated page, that they are diverted to one specific page (e.g., to a general English page using euro).

Self-referencing statements only

In spring 2023, we had the following situation:

  • Large number of sites, targeted to different language/country combinations - See the wrong example above
  • As these were different sites, hreflang statements to refer to these sites, were not relevant, as they only work for different pages on the same site

However, all pages on a given site, could benefit from a self-referencing hreflang statement. How that may look like (note that at DVB, we use country_language, which unfortunately, is the opposite of how the rest of the world seem to encode this stuff - sorry):

nl_nl:

* Home page: <link rel="alternate" href="https://voorbeeld.nl/"        hreflang="nl-nl" />
* Blog page: <link rel="alternate" href="https://voorbeeld.nl/blog/"   hreflang="nl-nl" />

be_nl:

* Home page: <link rel="alternate" href="https://voorbeeld.be/"        hreflang="nl-be" />
* Blog page: <link rel="alternate" href="https://voorbeeld.be/blog/"   hreflang="nl-be" />

nl_en:

* Home page: <link rel="alternate" href="https://example.nl/"        hreflang="en-nl" />
* Blog page: <link rel="alternate" href="https://example.nl/blog/"   hreflang="en-nl" />

be_en:

* Home page: <link rel="alternate" href="https://example.be/"        hreflang="en-be" />
* Blog page: <link rel="alternate" href="https://example.be/blog/"   hreflang="en-be" />

eur_en:

* Home page: <link rel="alternate" href="https://example.com/"        hreflang="en-eu" />
* Blog page: <link rel="alternate" href="https://example.com/blog/"   hreflang="en-eu" />

Concerning eur_en, there might be more options available. I don't know if these can be included at once. Besides, the tool that one of our marketing partners uses, gave errors at at least one of these (I think it was en-ex. E.g.:

eur_en - Home page:

* <link rel="alternate" href="https://example.com/"   hreflang="en-eu" />       # English + Europe
* <link rel="alternate" href="https://example.com/"   hreflang="x-default" />   # If nothing else fits
* <link rel="alternate" href="https://example.com/"   hreflang="en" />          # English
* <link rel="alternate" href="https://example.com/"   hreflang="en-ex" />       # Euro zone

See also

Sources