Hreflang Validator
Проверьте корректность hreflang-разметки и взаимных ссылок между языковыми версиями.
Hreflang Validator — проверка alternate и reciprocal
Проверьте hreflang-разметку multilingual страниц: корректность кодов, наличие x-default, дубликаты и взаимные alternate-ссылки между языковыми версиями.
Как пользоваться
- Введите URL страницы, которая должна участвовать в hreflang-кластере
- Запустите проверку и проанализируйте ошибки кодов, x-default и self-reference
- При необходимости включите reciprocal-проверку и исправьте несвязанные локали
FAQ
Hreflang check: что проверяет валидатор и как читать отчёт
Hreflang validator загружает страницу, находит в HTML все теги <link rel="alternate" hreflang="…" href="…"> и проверяет кластер языковых версий. Сверху — три цифры: сколько alternate-ссылок найдено, сколько среди них уникальных кодов и сколько проблем. Ниже — список проблем и таблица: код, целевой URL, HTTP-статус и колонка Reciprocal.
Что считается проблемой:
- Нет ни одной hreflang-ссылки — разметка не выводится в HTML или добавляется скриптом после загрузки (инструмент JavaScript не выполняет).
- Некорректный код — не похож на «язык» или «язык-регион» (
en,en-gb,pt-br) и не равенx-default. - Дубликат кода — один и тот же код указывает на разные URL.
- Нет x-default — рекомендация, не ошибка.
- Нет self-reference — среди alternate нет ссылки на проверяемую страницу. Сравнение не учитывает регистр домена и концевой слэш, но
http/httpsиwwwразличаются.
Без переключателя reciprocal инструмент запрашивает заголовки каждого alternate-адреса и показывает итоговый код ответа. С переключателем он полностью загружает первые восемь версий и ищет на каждой ссылку обратно на вашу страницу. Это и есть hreflang testing взаимности. Для остальных версий в таблице будет «—».
Синтаксис hreflang
<link rel="alternate" hreflang="ru" href="https://example.com/ru/catalog/" /> <link rel="alternate" hreflang="uk" href="https://example.com/uk/catalog/" /> <link rel="alternate" hreflang="en-gb" href="https://example.com/en-gb/catalog/" /> <link rel="alternate" hreflang="en-us" href="https://example.com/en-us/catalog/" /> <link rel="alternate" hreflang="x-default" href="https://example.com/catalog/" />
- Язык — код ISO 639-1 из двух букв:
ru,uk,en,pl,de. - Регион (необязательно) — ISO 3166-1 alpha-2 после дефиса:
en-gb,de-at. Регион без языка не работает:hreflang="ua"илиhreflang="gb"— ошибка. - Регистр не важен:
en-GBиen-gbравнозначны. - Адреса — только абсолютные, с протоколом. Инструмент достраивает относительные адреса, чтобы проверить их, но в разметке пишите полный URL.
Ловушки в кодах
Валидатор проверяет форму кода, а не его существование. Поэтому смотрите таблицу глазами:
en-uk— ошибка: код Великобритании —gb, аuk— это украинский язык. Правильноen-gb.ua— код страны, а не языка. Для украинского языка нуженuk, для украиноязычной Украины —uk-ua, для русскоязычной аудитории в Украине —ru-ua.zh-Hant,zh-Hans(письменность) иes-419(Латинская Америка) Google принимает, но строгая проверка формата отметит их как некорректные. Если у вас такие коды, это ложная тревога.
x-default: когда и куда ставить
x-default — версия для всех, кому не подошёл ни один код: другой язык браузера, другая страна. Обычно это страница выбора языка или основная (чаще англоязычная) версия. Указывать x-default не обязательно, но для сайтов с геоперенаправлением это лучший способ показать Google, что главная без префикса — не отдельная языковая версия. Не ставьте автоматический редирект по IP на x-default: Googlebot ходит в основном с американских адресов и может не увидеть остальные версии.
Язык или язык-регион
Региональный код нужен, только когда версии реально различаются: цены и валюта, доставка, юридические условия, местная лексика. Если английская версия одна для всех стран, достаточно en. Почти одинаковые en-us и en-gb с hreflang — нормальная практика: дублем Google их не считает, а показывает каждой стране свою.
Взаимность и self-reference
Hreflang работает только парами. Если русская страница ссылается на украинскую, а украинская на русскую — нет, Google игнорирует связь. Каждая версия должна перечислять все версии кластера, включая себя. Поэтому разметку генерируют из одного источника (общей таблицы переводов), а не вписывают вручную на каждой странице.
Частые ошибки hreflang
| Ошибка | Последствие | Как найти |
|---|---|---|
| Alternate ведёт на редирект | Google ожидает конечный адрес; цепочка ослабляет сигнал | Валидатор показывает статус после редиректа, поэтому прогоните адреса через проверку редиректов |
| Alternate на 404 или noindex | Версия выпадает из кластера | Статус в таблице; noindex — в анализе мета-тегов |
| Canonical на другую языковую версию | Google склеивает версии и показывает одну | Каждая версия должна быть каноничной сама себе |
| Нет обратной ссылки | Связь игнорируется | Режим reciprocal |
| Разные адреса одной страницы (слэш, www, параметры) | Self-reference и взаимность не совпадают | Сравните колонку URL с canonical |
| Hreflang на непереведённой странице | Пользователь получает не тот язык | Ставьте hreflang только при реальном переводе |
Hreflang test по шагам
- Проверьте главную и по одной странице каждого шаблона (категория, товар, статья) без reciprocal — убедитесь, что разметка вообще выводится, коды корректны, есть x-default и self-reference.
- Включите reciprocal для тех же страниц. Каждая строка с «Нет» — версия, которая не ссылается обратно. Чаще всего так бывает, когда перевод страницы опубликован, а на исходной её ещё нет — или наоборот.
- Откройте каждую версию из таблицы и проверьте её саму: набор ссылок на всех версиях должен быть одинаковым. Если на одной версии пять alternate, а на другой четыре, кластер рассинхронизирован.
- Сверьте canonical каждой версии: он должен совпадать с адресом этой версии в hreflang, символ в символ.
- После правок запросите переобход ключевых страниц через «Проверку URL». Google пересобирает кластеры постепенно, по мере переобхода всех версий.
Где ломается чаще всего
В WordPress hreflang выводят плагины мультиязычности (WPML, Polylang), а SEO-плагин отдельно выводит canonical. Проблемы начинаются, когда страница не связана с переводом в настройках плагина: hreflang для неё просто не появляется. В самописных CMS и на Битриксе разметку обычно собирают в шаблоне шапки. Типичная ошибка там — брать адрес текущей страницы из запроса вместе с UTM-метками и параметрами сортировки, и тогда self-reference никогда не совпадает с canonical.
Три способа разметки и hreflang в sitemap
Hreflang можно указать в <head>, в HTTP-заголовке Link (единственный вариант для PDF) или в sitemap.xml. Выберите один способ: смешивание допустимо, но противоречия между источниками усложняют диагностику. Инструмент проверяет только теги в HTML.
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://example.com/ru/catalog/</loc>
<xhtml:link rel="alternate" hreflang="ru" href="https://example.com/ru/catalog/"/>
<xhtml:link rel="alternate" hreflang="uk" href="https://example.com/uk/catalog/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/catalog/"/>
</url>
<!-- такой же блок <url> для /uk/catalog/ -->
</urlset>
Sitemap удобен для больших сайтов — не раздувает HTML каждой страницы. Но каждая версия должна быть отдельным <url> с полным набором ссылок. Карту можно разобрать в анализе sitemap.xml.
Отчёт «Международное таргетирование» Google убрал из Search Console. Поэтому ошибки hreflang теперь ищут сторонними проверками и через «Проверку URL»: в ней видно, какую страницу Google выбрал канонической. Основы — в статье «Что такое hreflang», официальные правила — в документации Google.
Улучшите позиции в поиске
SEO-проблемы могут стоить вам трафика. Каскадный линкбилдинг улучшит видимость сайта в поиске.