Содержание
Про hreflang ходят два убеждения: «90% сайтов делают его неправильно» и «мельчайшая ошибка выключает его целиком, лучше не использовать». Я проверил оба по документации Google, высказываниям сотрудников поиска и чужим исследованиям, а потом измерил сам: главные страницы 5 000 доменов из списка Tranco. Главная получена у 2 946, hreflang нашёлся у 912, выборка смещена к крупным и служебным доменам. Число 90% я не нашёл ни в одном из просмотренных источников. Нарушение правил Google нашлось у 19% сайтов с hreflang в моей выборке, а неверный код Google отбрасывает по одной ссылке. Вместе с ней пропадает возврат для пары, а шаблонная ошибка повторяется на всех страницах, так что на практике выпадает язык целиком. Страницу целиком отключают другие поломки (раздел 7). Как проверить свой сайт: чек-лист и валидатор в разделе 9.
- Верны ли два убеждения. Что говорят Google и измерения Ahrefs, Semrush, Search Engine Land, и что показал мой замер на 912 сайтах.
- Какие коды путают и важен ли регистр. Страна вместо языка,
ukвместоen-GB,es-419, подчёркивание,fil. - Как выглядит правильный hreflang. Рабочий код для HTML, HTTP-заголовка и sitemap, с разбором, какой способ выбрать.
- Какие ошибки не про коды. Закрытый
head, canonical на другой язык, редиректы,noindex, перенаправление по IP. - Что делать. Порядок проверки, таблица из 208 строк «неправильно → правильно» и валидатор, которые можно скачать.
Онлайн-проверки по адресу сайта здесь нет. Валидатор запускается у вас на компьютере, читает локальные файлы с разметкой и в сеть не ходит.
Hreflang — разметка, которая сообщает поисковику, что у страницы есть версии на других языках или для других стран. Google использует её, чтобы показать пользователю нужную версию вместо той, которая нашлась в индексе. По словам Google, на ранжирование разметка не влияет. Джон Мюллер (Google), 28 марта 2018 года: «It doesn't change rankings, but helps to get the "right" URL swapped in for the user» («Она не меняет ранжирование, но помогает подставить пользователю нужный URL»).
Что hreflang делает и чего не делает
Разметка работает как справочник соответствий: «эта страница — английская для США, вот её немецкий двойник, вот запасная». Из документации и высказываний Google следует четыре ограничения, которые часто забывают.
Hreflang подменяет URL в выдаче
Мюллер (Reddit, 24 июня 2022 года): страницы разных доменных зон с одинаковым содержимым Google может склеить в один canonical, а hreflang всё равно подставляет нужный адрес. Search Console при этом отчитывается по canonical: «Search Console generally reports on the canonical URLs».
Язык страницы определяется не по ней
Справка Google: «Google doesn't use hreflang or the HTML lang attribute to detect the language of a page; instead, we use algorithms to determine the language.» Google язык по тегу lang и мета content-language не определяет; для других поисковиков их лучше оставить.
Сила между версиями не делится
Гэри Иллис (Google, Reddit, 8 февраля 2019 года): «Within the cluster the signals aren't passed around». Версия на другом языке не наследует сигналы соседней.
Нужен не всегда
Мюллер, 28 марта 2018 года: «Use it if you see the wrong country/language version ranking, otherwise you probably don't need it». У сайта на одном языке разметка «doesn't do anything anyway».
Google называет три случая, где разметка оправдана: переведён только шаблон (меню и подвал), есть мелкие региональные различия внутри одного языка (английский для США, Великобритании и Ирландии) или контент полностью переведён. Переведённые версии дублями не считаются: Google относит страницы к дублям, «only if the main content of the page remains untranslated». Одна оговорка: справка Google допускает, что языковые версии он находит и без разметки, но «it is usually best for you to explicitly indicate» их.
Три тезиса и что по ним нашлось
«90% сайтов делают hreflang неправильно»
источника нетЧисло 90% не встретилось ни в одной работе. Измерения дают от 31% (частный показатель: конфликтующие директивы) до 75% в зависимости от метода. Мой замер: 19,2% сайтов с нарушением правил Google на главной (175 из 912); среди 814 сайтов с проверенной альтернативой 22,4% с учётом ссылок назад и 23,6% (192 из 814) с добавлением выводов из высказываний Google.
«Мельчайшая ошибка выключает hreflang»
частичноНеверная ссылка игнорируется сама, остальные работают. Но нет ссылки назад — игнорируется пара, а закрытый раньше времени head сбрасывает разметку страницы целиком.
«Лучше не использовать hreflang»
узкоВерно для сайтов без дублей между рынками и для связей между не-переводами. Неверно, если Google показывает не ту версию: тогда разметка нужна. Измерений вреда от самих ошибок я не нашёл ни у одной из сторон.
Тезис 1. «90%»: что измеряли другие
Выше всего оценки, где ошибкой считается и рекомендация, и опечатка. У каждой работы свой набор проверок, своя единица счёта и своя выборка, поэтому числа ниже нельзя сравнивать между собой и с моим.
Чужие измерения: доля сайтов с ошибкой
20 000 сайтов с несколькими языками
374 756 доменов с hreflang
2 300 сайтов с юго-восточной локалью
18 786 сайтов, только конфликтующие директивы
912 сайтов, нарушение правил Google на главной
Выборки и методы чужих измерений (таблица 1)
| Кто и когда | Выборка | Доля |
|---|---|---|
| Semrush, 2017 (по пересказу Search Engine Journal) | 20 000 сайтов с несколькими языками из клиентов Site Audit; цель исследования названа открыто: привлечь внимание SEO-специалистов к проблемам hreflang | 75% |
| Ahrefs, 2023 | 374 756 доменов, которые используют hreflang; хотя бы одна проблема | 67% |
| seotal, 2026 | 2 300 сайтов с юго-восточной локалью среди 11 106 сайтов с hreflang (из 50 497 прочитанных главных страниц); данные от 13 сентября 2026 года, часть проверок авторские | 53,1% |
| Dan Taylor (Search Engine Land), 2023 | 18 786 сайтов из NerdyData, только hreflang в head; 31% — доля сайтов с конфликтующими директивами, а не с любой ошибкой | 31% |
Внутри этих работ видно, из чего складываются проценты. Ahrefs отдельно называет отсутствие x-default у 56,3% доменов, отсутствие самоссылки у 18%, ссылки на редирект или битую страницу у 16,9%, отсутствие ссылок назад у 15,3%, hreflang на неканоническом URL у 8% и неверные значения у 4,6%. Semrush оценивает конфликты в коде страницы в 58% сайтов, причём в 96% случаев не хватало самоссылки. Две популярные цифры, «72% (Ahrefs, 2026)» и «одна ошибка обнуляет примерно 40% реализаций», я проследить до источника не смог, поэтому в статью они не вошли.
Тезис 2. «Мельчайшая ошибка выключает hreflang»
Google описывает точечное поведение. Мюллер, Reddit, 26 апреля 2018 года: «If hreflang isn't valid (non-indexed pages linked, invalid language codes) then it's ignored & the same as not having it at all (this is on a per-hreflang-link basis, so if some are ok, they'll work)» («Если hreflang невалиден, он игнорируется, как будто его нет; это происходит для каждой ссылки отдельно, так что рабочие продолжают работать»). Иллис, office hours, январь 2023 года: кластер строится из ссылок, которые Google смог подтвердить, а страница с noindex в кластер не попадает: «The cluster will be created regardless with the other valid links».
Есть исключения, когда ломается больше одной ссылки.
- Нет ссылки назад. Справка Google: «If two pages don't both point to each other, the tags will be ignored». Игнорируется пара, остальные пары живы.
- Закрытый
head. Мюллер, 29 марта 2018 года: некоторые скрипты вставляют в началоheadтеги, которые должны стоять вbody. Для Google это неявно закрываетhead, и «for hreflang, that often results in those annotations being dropped completely». Ломается размещение тегов, коды в них могут быть верными. - Связь между не-переводами. Мюллер (26 апреля 2018 года): если английскую страницу «Fish» связать с испанской «Chicken», это «probably worse than not having hreflang set up at all».
Кластер с одним потерянным возвратом
- Пара взаимная: страницы ссылаются друг на друга, пара работает.
- Страница en заявляет de-DE альтернативой, но ответа нет.
- У de-DE нет ссылки на en: пара en и de-DE игнорируется, пары с ru остаются.
Итог: Google отбрасывает неверную ссылку, но остальные пары кластера работают, если у них есть возврат. Если же ошибка стоит в шаблоне, она повторяется на каждой странице и выключает этот язык по всему сайту. Разметку страницы целиком отключают структурные поломки; их видно только в отрисованном HTML. Источники расходятся в одном месте: в 2022 году Иллис (по пересказу Search Engine Roundtable, оригинал я не открывал) говорил, что noindex у одного URL «can affect the whole cluster», добавив «hard to trigger it, but nonetheless, you can»; в 2023 году он сказал, что кластер создаётся и без такой страницы. Я принимаю более позднее и более подробное заявление, но на сайте с noindex в кластере его стоит проверять на живых данных.
Тезис 3. «Лучше не использовать»
За тезис есть три довода. Связь между не-переводами хуже, чем отсутствие разметки (раздел 2). Бонуса к ранжированию нет. А в конкурентной выдаче, по словам Мюллера (13 августа 2021 года), разметка «just makes it a lot harder for you to kind of grab more foothold there»: версии для разных стран приходится наращивать каждую отдельно. Есть и описания просадок после внедрения, например с 3 тысяч кликов в день до нескольких сотен (самоотчёт на Webmasters StackExchange), но причина в hreflang нигде не доказана.
Против тезиса говорят два довода, причём второй сводится к осторожному выводу. Мюллер (18 июня 2021 года): «i think there's definitely no disadvantage to using it». А в кейсе Clarks (Sistrix, 2020) до миграции hreflang не было вовсе, после переезда на новый домен его добавили с четырьмя проблемами: теги не на canonical-адресах, нет self-canonical, нет ссылок назад, не задан x-default. Против hreflang этот случай не говорит, как и в защиту: это неисправная разметка среди прочих правок.
ключей Clarks в Испании показывали адрес чужого рынка после миграцииВидимость в Испании упала с 1,579 до 0,050. Sistrix называет причиной сумму изменений: «Too many changes all at the same time».
Нужен ли hreflang вашему сайту
- 1На сайте есть версии для разных языков или стран?
Нет Hreflang не нужен: у сайта на одном языке разметка «doesn't do anything anyway».
Да Перейдите к вопросу 2.
- 2В выдаче показывается не та версия: чужая страна или язык?
Да Нужен. Мюллер советует включать разметку именно в этом случае.
Нет Перейдите к вопросу 3.
- 3Несколько стран на одном языке или переведено больше пары разделов?
Да Нужен.
Нет Не нужен, пока версии разных стран не конкурируют друг с другом и Google показывает правильные адреса.
- →Если решили внедрять
Начинайте с малого кластера, который можно проверить целиком. Языки без реальной версии пропустите: Google такое разрешает. Каждой версии нужен отдельный URL. Дальше идите по порядку проверки из раздела 9.
Замер главных страниц доменов из топ-5000 Tranco
Выборка: первые 5 000 доменов списка Tranco (список создан 18 октября 2026 года), замер 19 октября 2026 года. Главная страница получена и разобрана у 2 946 сайтов. У 912 из них (31,0%, 95% интервал 29,3–32,7%) есть hreflang в HTML или в заголовке ответа. Дальше доли считаются от этих 912 сайтов, если не сказано иное. Проверка шла по правилам справки Google: это замер соответствия документации, а не доказательство, что Google отбросил разметку.
От выборки до нарушений
Главная получена у 2 946 сайтов, hreflang есть у 912
Среди 912 сайтов с hreflang: нарушает хотя бы одно правило Google — 175
Нарушения правил Google на главных страницах
<link hreflang> нет rel="alternate"<link hreflang> в body, а не в headТаблица 2: числа сайтов и 95% интервалы
| Нарушение | Сайтов | Доля | 95% интервал |
|---|---|---|---|
| Неверный код языка или страны хотя бы в одной аннотации | 73 | 8,0% | 6,4–9,9% |
| Нет самоссылки | 60 | 6,6% | 5,1–8,4% |
| Canonical главной ведёт на другую страницу кластера (среди 840 с canonical) | 49 | 5,8% | 4,4–7,6% |
| Не абсолютный URL хотя бы в одной аннотации | 12 | 1,3% | 0,8–2,3% |
У <link hreflang> нет rel="alternate" | 4 | 0,4% | 0,2–1,1% |
<link hreflang> в body, а не в head | 2 | 0,2% | 0,1–0,8% |
| Хотя бы одно из перечисленных | 175 | 19,2% | 16,8–21,9% |
Запрос альтернатив добавляет проверку обратных ссылок. Я проверил до шести альтернатив на каждом сайте и получил ответ хотя бы от одной у 814 сайтов. У 82 из них (10,1%, интервал 8,2–12,3%) хотя бы у одной альтернативы нет ссылки назад в HTML или заголовке. Из sitemap возврат я не проверял, это завышает долю; лимит в шесть альтернатив, гео-редиректы и ответы защиты от ботов смещают оценку в обе стороны, поэтому число приблизительное. С учётом возврата хотя бы одно нарушение правил Google есть у 182 из 814 сайтов (22,4%). Если добавить выводы из высказываний Google (один код на разные URL, несколько x-default, canonical главной не равен её адресу), получается 192 из 814 (23,6%, интервал 20,8–26,6%). Без нарушений обоих уровней остаётся 622 сайта (76,4%).
Три уровня проверки
175 из 912 сайтов
182 из 814 сайтов
192 из 814 сайтов
К строке про неверный код: из 73 сайтов 39 используют только fil, es-419 и ckb. Эти значения допустимы по BCP 47, но вне списков ISO из справки Google. Как Google их обрабатывает, я не проверял. Если убрать 32 сайта, у которых это единственное нарушение, останется 143 из 912 (15,7%); пересчёт сделан после просмотра данных, интервал не считался.
Как меняется доля при другой классификации
175 из 912 сайтов
fil, ckb, es-419 или числовой регион143 из 912 сайтов
170 из 849 сайтов
Что ещё нашлось, но ошибкой не считается
en-gb): у 306 сайтов (33,6%), целиком заглавными не записан ни один код в выборке. Google принимает оба регистра.head он есть у 906 из 912 сайтов (99,3%), в том числе у 12, где он продублирован в заголовке. Только в заголовке ответа — у 4, только в body — у 2.Какие значения кодов оказались неверными
Неверный код в хотя бы одной аннотации есть у 73 сайтов. Всего проверено 16 861 аннотация, неверных 389 (2,3%). Больше всего аннотаций дают трёхбуквенные языки (277 аннотаций на 34 сайтах), подчёркивание вместо дефиса (30 на 4), числовой регион (20 на 19 сайтах, почти всегда es-419), неизвестный регион (20 на 11), регион вместо языка (7 на 5). Самые частые значения: es-419 (19 сайтов), fil (16), fil-ph (7), ckb (5), pt_br (3), en-eu (3). Значения fil, ckb, es-419 допустимы по BCP 47, но не входят в ISO 639-1 и ISO 3166-1, на которые ссылается справка Google. Из 73 сайтов 39 используют только такие значения (этот срез я выделил после просмотра данных, он не был заложен в метод). Как Google реально обрабатывает fil, я не проверял и опираюсь на букву справки.
sitemap: что нашлось в выборке из 300 сайтов
У 300 случайных сайтов с hreflang я просмотрел sitemap из robots.txt (до шести файлов на сайт). Директива Sitemap: есть у 196 из них (65,3%), хотя бы один файл прочитан у 187. Атрибуты xhtml:link с hreflang нашлись в просмотренной части у 50 сайтов (25,5% от 196). Главная страница найдена в sitemap у 101 сайта, у 26 из них в записи главной есть hreflang. У 17 из этих 26 набор «код — URL» совпал с HTML-разметкой, у 9 отличался. Это нижняя оценка: большие sitemap просмотрены частично. Расхождение наборов между способами — прямой путь к конфликту, о нём в разделе 7.
Как считалось и что нельзя из этого выводить
- Единица счёта — сайт (домен). Главная — страница
https://домен/после редиректов. Доли даны с 95% интервалом Уилсона, рассчитанным в предположении независимости сайтов; 204 из 2 946 главных повторяют конечный адрес более высокого домена, поэтому интервалы немного оптимистичны. Без этих повторов доля сайтов с нарушением 170 из 849 (20,0%) вместо 175 из 912 (19,2%). - Читался сырой HTML без выполнения JavaScript, с учётом robots.txt (главная закрыта для нашего бота у 177 доменов). Hreflang, который появляется только после скриптов, в замер не попал.
- Из 5 000 доменов главная не получена у 2 054: 1 187 недоступны (в основном SSL-ошибка на инфраструктурных доменах без публичного сайта), 515 ответили отказом или проверкой, остальные — прочие ошибки. Выборка смещена к крупным и служебным доменам, поэтому результат нельзя переносить на небольшие сайты: там доля может быть выше и ниже.
- Измерена только главная. Внутренние страницы, каталоги и карточки, где разметку чаще генерируют плагины и шаблоны, не проверялись.
- Запросы шли из одной точки сети (выход в Швеции), с языком браузера
en-US. Сайты, которые выбирают версию по IP, могли показать одну из своих версий. - Замер не оценивает влияние на позиции и трафик и не показывает, как Google обработал конкретную разметку.
Правила Google: что обязательно, что рекомендовано
Страница справки «Tell Google about localized versions of your page» обновлена 21 сентября 2026 года. Из неё на практике следуют десять правил.
- Каждая версия перечисляет себя и все остальные«Each language version must list itself as well as all other language versions». Нет самоссылки — нарушение правила (6,6% сайтов в моём замере).
- Ссылки взаимныеЕсли страница А указывает на Б, а Б не указывает на А, теги игнорируются; Google объясняет это защитой от чужих деклараций.
- URL полные, с протоколом
https://example.com/foo, а не//example.com/fooи не/foo. Схема обязательна: адрес без неё не годится. Требование Google. - Набор ссылок одинаков на каждой версииДля HTML и для заголовка Link. В sitemap каждая запись содержит весь набор, включая себя.
- Коды: язык ISO 639-1, регион ISO 3166-1 Alpha 2Регион отдельно, без языка, указывать нельзя. Скрипт по ISO 15924 допустим (
zh-Hant), регистр не важен. - Теги стоят в корректном
headСправка советует вставить отрисованный код в валидатор HTML и убедиться, что ссылки внутриhead. Рекомендация Google. - Hreflang не смешивают с другими атрибутами в одном
linkНапример, сmedia: на каждый вариант отдельный тег. Требование Google. - x-default — запасная страницаРекомендация, не обязанность. Лучше всего работает на странице выбора языка; языка для него указывать не нужно.
- Для нескольких стран на одном языке нужна общая версия языкаРядом с
en-IE,en-CA,en-AUGoogle советует дать страницуenдля всех остальных англоязычных мест. Рекомендация Google. - Canonical ведёт на страницу того же языка«make sure to specify a canonical page in the same language». Canonical с атрибутом
hreflangGoogle не использует, а адреса из hreflang-кластеров он предпочитает при выборе canonical. Рекомендация Google.
Способов внедрения три, и для Google они равнозначны: «The three methods are equivalent from Google's perspective». Использовать все сразу можно, но выгоды нет, а управлять тремя реализациями сложнее. Сторонние инструменты проверки, как сказано в справке, «are not maintained or checked by Google», а официального отладчика, по словам Иллиса в подкасте Search Off the Record (2024), у Google нет. Поэтому зелёный отчёт любого сервиса не доказывает, что Google принял разметку.
Коды языка и страны: что путают и что нет
Первая часть кода — язык, вторая, необязательная, — страна. Отсюда две частые путаницы: страну пишут вместо языка, а язык принимают за страну. Таблица собрана по справке Google, реестру языковых тегов IANA (файл от 17 сентября 2026 года) и RFC 5646. Колонки частоты в ней нет сознательно: частоту по отдельным кодам, кроме замера выше, никто не измерял.
| Пишут | Что это на самом деле | Правильно |
|---|---|---|
jp, cn | Регионы Япония и Китай; кода языка с такими буквами нет | ja, zh-CN или zh-Hans |
kr, se | Языки канури и северносаамский, а не корейский и шведский | ko, sv |
dk, gr, cz, ua | Только регионы | da, el, cs, uk |
en-UK | Региона UK в реестре нет, Великобритания — GB; Google называет UK среди кодов, которые «doesn't have an effect» (игнорируется весь код или только регион, Google не уточняет) | en-GB |
uk для Великобритании | uk — украинский язык | en-GB (для украинского uk верен) |
be для Бельгии | Белорусский язык; пример прямо в справке Google | nl-BE, fr-BE |
es-419, en-EU, UN | Не поддерживаются Google; es-419 — регион ООН, EU и UN зарезервированы | Для es-419: es или отдельные страны (es-MX, es-AR). Для en-EU: en или код страны. Для UN: код языка с регионом или x-default |
es-LA, la | LA — Лаос, la — латинский язык; это ошибка, только если имелась в виду Латинская Америка | es или отдельные страны |
us, GB без языка | Регион без языка; Google язык из страны не выводит | en-US, en-GB |
GB-en | Обратный порядок частей | en-GB |
en_US, pt_br | Разделитель в формате — дефис; в грамматике RFC 5646 подчёркивания нет. Поведение Google не найдено | en-US, pt-BR |
eng, rus, deu | Трёхбуквенные коды; в реестре IANA для таких языков определён только двухбуквенный | en, ru, de |
fil | Валиден по BCP 47, но не входит в ISO 639-1; по букве справки Google не поддерживается, поведение не проверено | tl по букве справки; работающую разметку переделывать не обязательно, проверьте выдачу с gl=ph |
iw, in, ji | Устаревшие коды иврита, индонезийского, идиша; в справке Google о них не сказано | he, id, yi |
zh-CHS, zh-CHT | Таких подтегов нет в реестре | zh-Hans, zh-Hant |
pt-PT и pt-BR наоборот | Оба кода валидны, ошибка в сопоставлении кода и адреса; синтаксис её не показывает | Португалия — pt-PT, Бразилия — pt-BR |
Регистр: пишите en-GB, но Google ошибки не увидит
В справке Google: «The hreflang value is case-insensitive; Google accepts lowercase and uppercase codes, but formatting region codes in uppercase (for example, en-GB) follows ISO 3166-1 Alpha 2 convention». Миф «регистр критичен» опровергают три источника: справка Google, RFC 5646 (регистр смысла не несёт, рекомендуется язык строчными, скрипт с заглавной, регион заглавными) и пример самого Яндекса, где регион записан строчными (en-us, tr-tr). В моём замере 23,2% аннотаций с валидным кодом записаны строчными, целиком заглавными — ни одной. Строчные коды не ошибка: переделывать работающую разметку ради регистра не нужно, а в новой пишите en-GB.
Правильный код ещё не означает правильную разметку. pt-PT и pt-BR, поставленные на противоположные страницы, пройдут любой валидатор. Смысл пары проверяет только человек, и именно такие связи Мюллер называл хуже, чем отсутствие hreflang.
Три способа внедрения и эталонный код
Примеры написаны на условном домене example.com (он зарезервирован для примеров, реального сайта за ним нет). Кластер из четырёх версий: en, en-GB, de-DE, ru, страница выбора языка в корне как x-default. Код сверен с документацией Google и проверен приложенным валидатором: замечаний нет.
Обычные страницы, когда нет доступа к sitemap и заголовкам.
PDF и другие файлы, где нет head.
Большие сайты и каталоги: разметка отделена от шаблонов страниц.
Способ 1. HTML: теги в head
Подходит, когда нет возможности править sitemap и заголовки ответа. Эти же пять строк стоят на каждой из пяти страниц кластера, включая саму страницу выбора языка. Переведённая версия выглядит так (страница https://example.com/en-gb/):
<!doctype html>
<html lang="en-GB">
<head>
<meta charset="utf-8">
<title>Example Widgets (UK)</title>
<link rel="canonical" href="https://example.com/en-gb/">
<link rel="alternate" hreflang="en" href="https://example.com/en/">
<link rel="alternate" hreflang="en-GB" href="https://example.com/en-gb/">
<link rel="alternate" hreflang="de-DE" href="https://example.com/de-de/">
<link rel="alternate" hreflang="ru" href="https://example.com/ru/">
<link rel="alternate" hreflang="x-default" href="https://example.com/">
</head>
<body>...</body>
</html>- Canonical ведёт на себя же, на страницу того же языка.
- Страница перечисляет себя (
en-GB) и все остальные. Набор идентичен на всех версиях. - Все адреса абсолютные, с
https. Регион записан заглавными, язык — строчными. - В одном
linkнет атрибутаmedia. - Теги стоят в
headвыше любых скриптов, которые могут вставить тудаbody-разметку.
Способ 2. HTTP-заголовок Link: для PDF и файлов без HTML
Заголовок нужен там, где нет head: PDF и другие файлы. Набор значений одинаков для всех версий и включает запрошенную. Формат следует RFC 8288: адрес в угловых скобках, затем параметры. Все значения hreflang я записал в одной строке через запятую, как в примере Google; несколько отдельных строк Link стандарт допускает, но как с ними поступает Google для hreflang, я не подтвердил.
HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Language: de
Link: <https://example.com/files/manual-en.pdf>; rel="alternate"; hreflang="en", <https://example.com/files/manual-de.pdf>; rel="alternate"; hreflang="de-DE", <https://example.com/files/manual-ru.pdf>; rel="alternate"; hreflang="ru", <https://example.com/files/manual-en.pdf>; rel="alternate"; hreflang="x-default"
Link: <https://example.com/files/manual-de.pdf>; rel="canonical"Это ответ на запрос https://example.com/files/manual-de.pdf. На английском и русском файлах заголовок тот же, меняется только строка с canonical.
Способ 3. Sitemap: xhtml:link в каждой записи
Практичнее всего при большом числе языков и URL, потому что страницы не тяжелеют. Нужно объявить пространство имён xmlns:xhtml, а в каждый url положить весь набор альтернатив, включая сам адрес. Один кластер в примере лежит в одном файле. Справка Google о разносе по файлам молчит, а Мюллер (Reddit, 7 июня 2022 года) пишет: «It's fine to split it across sitemap files», главное — взаимная связь, а не место разметки.
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://example.com/en/products/widget/</loc>
<lastmod>2026-10-01</lastmod>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/products/widget/"/>
<xhtml:link rel="alternate" hreflang="en-GB" href="https://example.com/en-gb/products/widget/"/>
<xhtml:link rel="alternate" hreflang="de-DE" href="https://example.com/de-de/produkte/widget/"/>
<xhtml:link rel="alternate" hreflang="ru" href="https://example.com/ru/produkty/widget/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/products/widget/"/>
</url>
<!-- такая же запись для /en-gb/, /de-de/ и /ru/ с тем же набором из пяти xhtml:link -->
</urlset>- Знак
&в адресе записывают как&, кириллицу в пути — процентным кодированием UTF-8. - Теги
priorityиchangefreqGoogle игнорирует;lastmodимеет смысл только точный. - Лимиты на файл: 50 000 URL и 50 МБ. Для большего числа URL делают индекс sitemap (
sitemapindex).
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://example.com/sitemap.xml</loc>
<lastmod>2026-10-01</lastmod>
</sitemap>
<sitemap>
<loc>https://example.com/sitemap-zh.xml</loc>
<lastmod>2026-10-01</lastmod>
</sitemap>
</sitemapindex>Как выбрать способ
HTML
- Для обычных страниц, когда нет доступа к sitemap и заголовкам.
- Страницы тяжелее, а при сотне языков разметка занимает заметную долю
head. - Яндекс в справке Вебмастера описывает именно разметку в
head.
Sitemap и заголовок
- Sitemap — для больших сайтов и каталогов: разметка отделена от шаблонов страниц.
- Заголовок
Link— для PDF и других файлов безhead. - Яндекс, по справке Вебмастера, sitemap для языковых версий больше не поддерживает.
Смешивать способы можно, пока они согласованы. Мюллер (стрим 27 ноября 2020 года): приоритета «sitemap лучше HTML» нет, а конфликт возникает, когда одна пара «язык — страна» указана для разных страниц. Тогда Google, по его словам, «would probably just drop that pair». Отсюда правило: одна пара «язык — страна» указывает на один адрес во всех способах. В моём замере у 9 из 26 сайтов, где главная размечена и в HTML, и в sitemap, наборы различаются.
сайтов, у которых hreflang главной есть и в HTML, и в sitemap, разошлись в наборе «код — URL»У 17 наборы совпали. Это нижняя оценка: большие sitemap просмотрены частично.
Ошибки не про коды: где реально ломается
Коды проверяет любой валидатор. Следующие ошибки инструменты находят хуже.
Закрытый раньше времени head
Скрипт или noscript с iframe в начале head закрывает его неявно, и теги hreflang оказываются в body. Разбор такого случая в выпуске Google Search Central «SEO Fairy Tales» (2022): iframe внутри noscript закрывает head, «because an iframe shall not be in the head». Проверять нужно отрисованный HTML. Инструменты без рендеринга такое не видят.
Canonical на другой язык
Если canonical французской страницы ведёт на английскую, локализованная страница может свестись к чужой: Google просит указывать canonical на странице того же языка. В моём замере у 5,8% сайтов canonical главной указывает на другую страницу кластера.
Hreflang на неканоническом адресе
Мюллер (office hours, 9 июля 2019 года): если адрес не считается каноническим, Google его не покажет, и «any annotation that's associated with that URL would not be used». Адреса с параметрами и UTM в hreflang не нужны.
Альтернатива отвечает редиректом, 404 или закрыта
Страница с noindex в кластер не попадает (Иллис), а Ahrefs относит ссылки на редирект и битую страницу к ошибкам. В моём замере у 87 сайтов хотя бы одна альтернатива отвечала редиректом, у 13 — ошибкой 4xx или 5xx.
Перенаправление по IP или языку браузера
Если один и тот же адрес сразу отправляет робота на версию по IP, остальные версии он может не увидеть. Блог Bing (2009): «Having a contextual URL per language is necessary for ensuring the content is crawled». Для Google нужен отдельный URL на каждую версию.
Плагины и CMS
Тот же набор записывают дважды: плагин пишет hreflang в sitemap, а тема или второй плагин добавляет теги в head. Получаются дубли и конфликты. В CMS проверяйте, где разметку выводит каждый плагин, и оставляйте один способ.
Canonical и hreflang: куда ведёт canonical
<link rel="canonical" href="https://example.com/fr/">
<link rel="alternate" hreflang="fr" href="https://example.com/fr/">
<link rel="alternate" hreflang="en" href="https://example.com/en/">
Страница сама себе canonical и перечисляет себя в hreflang.
<link rel="canonical" href="https://example.com/en/">
<link rel="alternate" hreflang="fr" href="https://example.com/fr/">
<link rel="alternate" hreflang="en" href="https://example.com/en/">
Французская страница называет главной английскую. Локализованная версия может свестись к чужой, а аннотации адреса, который не считается каноническим, по словам Мюллера, не используются.
Таблица 4 собирает по этим и предыдущим разделам, что именно перестаёт работать при каждой ошибке, как её найти и как исправить.
| Ошибка | Что перестаёт работать | Масштаб | Как найти | Как исправить | Основание |
|---|---|---|---|---|---|
| Неверный код в одной ссылке | Эта ссылка игнорируется, остальные работают | Ссылка; если код в шаблоне, то язык на всём сайте | Валидатор, сверка с реестром IANA | Заменить по таблице 3 | сотрудник Google |
| Нет ссылки назад | Игнорируется пара, остальные пары живы | Пара | Сверить набор ссылок на обеих страницах, валидатор | Добавить возврат на каждой версии | справка Google |
| Нет самоссылки | Нарушено правило справки; что именно Google отбрасывает, он не описывает | Страница, не подтверждено | Валидатор | Добавить ссылку на саму страницу | справка Google |
head закрылся раньше времени | Аннотации страницы отбрасываются целиком | Страница | Отрисованный HTML: «Проверить URL → Просмотреть проверенную страницу» | Убрать из начала head теги, которым место в body, или перенести скрипт ниже | сотрудник Google |
| Canonical ведёт на другой язык | Локализованная версия может свестись к чужой | Страница | Сравнить canonical с адресом страницы | Canonical на саму страницу | рекомендация Google |
| Hreflang на неканоническом адресе | Аннотации этого адреса не используются | Адрес | Сверить адреса из hreflang с canonical, убрать параметры и UTM | Указывать канонический адрес | сотрудник Google |
Альтернатива с noindex | Страница в кластер не попадает, кластер строится по остальным ссылкам | Ссылка | Проверить мета robots и заголовок ответа у каждой страницы кластера | Снять noindex или убрать ссылку из набора | сотрудник Google |
| Альтернатива отвечает редиректом | Пару не стоит считать исправной: возвратная ссылка с конечной страницы указывает на другой адрес | Пара | Проверить код ответа каждой альтернативы | Указать в hreflang конечный адрес | вывод из правил |
| Связь между не-переводами | «Probably worse than not having hreflang set up at all» | Кластер | Только вручную: валидатор смысл пары не видит | Связывать только версии одного содержимого | сотрудник Google |
| Один код ведёт на разные адреса в HTML и sitemap | Google «would probably just drop that pair» | Пара | Сравнить наборы «код — адрес» в HTML и sitemap | Один способ или одинаковые наборы | сотрудник Google |
Я не нашёл подтверждения, как Google обрабатывает символ # в адресе hreflang, элемент xhtml:link вне url и hreflang, объявленный только в индексе sitemap. Эти случаи в таблице помечены «не подтверждено».
Таблица: 208 строк «неправильно → правильно»
В таблице собрано всё, что нашлось в документации Google, высказываниях сотрудников, исследованиях и справках инструментов: у каждой строки есть код неверного варианта, код правильного, оценка надёжности вывода и идентификаторы источников. Строки разбиты на девять групп. Каждая группа раскрывается в отдельную таблицу. Полный файл со всеми колонками (что говорят источники, какие инструменты ловят ошибку, серьёзность) можно скачать.
Скачать таблицу (CSV, 208 строк)
- Google напрямую — в документации или высказывании Google есть точная формулировка.
- Заявление сотрудника — слова сотрудника Google (Мюллер, Иллис и другие), привязанные к дате.
- Документация не Google — справки Яндекса и Bing, стандарты вроде RFC.
- Вывод из правил — следует из стандартов и справки Google, но прямого утверждения нет.
- Вторичный источник — описано в блоге или инструменте.
- Не подтверждено — прямых источников нет; строка оставлена как описание ситуации.
Если у строки несколько меток, фильтр считает первую.
Строк: 208 из 208
А. Код языка · 24
| № | Ошибка | Неправильно | Правильно | Надёжность |
|---|---|---|---|---|
| 1 | Трёхбуквенный код языка вместо двухбуквенного (eng, rus, deu) | | | Google напрямую |
| 2 | Код страны вместо кода языка: jp для японского | | | вывод из правил |
| 3 | Код страны вместо кода языка: cn для китайского | | | вывод из правил |
| 4 | kr для корейского (код канури) | | | вывод из правил |
| 5 | se для шведского (код северносаамского) | | | вывод из правил |
| 6 | Коды стран dk, gr, cz вместо кодов языков | | | вывод из правил |
| 7 | ua для украинского | | | вывод из правил |
| 8 | uk как «United Kingdom» в языковой позиции (uk — это украинский язык) | | | вывод из правил |
| 9 | Устаревший код иврита iw | | | вывод из правил |
| 10 | Устаревший код индонезийского in (одновременно IN — Индия) | | | вывод из правил |
| 11 | Устаревший код идиша ji | | | вывод из правил |
| 12 | Устаревшие коды jw (яванский) и mo (молдавский) | | | вывод из правил |
| 13 | no-NO вместо более точного nb-NO / nn-NO (нормативно это не ошибка) | | | вывод из правил |
| 14 | fil вместо tl для филиппинского | | | Google напрямую |
| 15 | Опечатка в коде языка (fl вместо tl) | | | вторичный источник |
| 16 | Опечатка превращает код в другой валидный язык (fi вместо fr) | | | вторичный источник |
| 17 | cr вместо hr для хорватского | | | вторичный источник |
| 18 | sh (сербохорватский) вместо sr, hr или bs | | | вывод из правил |
| 19 | la как «Латинская Америка» | | | вторичный источник |
| 20 | Язык в hreflang не совпадает с языком контента (французский тег на английской странице) | | | вторичный источник |
| 21 | Несовпадение html lang и hreflang | | | вторичный источник |
| 22 | Язык вне списка из 40 языков Яндекса в расчёте на Яндекс (zh, ja, ko, hi, th, id, vi и др.) | | | официальная документация (не Google) |
| 23 | Реестр IANA пропускает 7 двухбуквенных кодов, которых нет среди 183 актуальных кодов ISO 639-1 (bh, in, iw, ji, jw, mo, sh) | | | вывод из правил |
| 24 | Валидный по BCP 47 тег с языком вне ISO 639-1 (fil-PH, kok-IN, prs-AF, quz-BO) | | | вывод из правил |
Б. Код региона · 22
| № | Ошибка | Неправильно | Правильно | Надёжность |
|---|---|---|---|---|
| 25 | en-UK вместо en-GB | | | Google напрямую |
| 26 | EU как регион (en-EU, es-eu): континенты Google не поддерживает | | | Google напрямую |
| 27 | UN как регион или одиночное значение | | | Google напрямую |
| 28 | Придуманные «рыночные» коды (EU, APAC) вместо ISO | | | вторичный источник |
| 29 | es-419 (Латинская Америка, UN M.49) | | | Google напрямую |
| 30 | es-LA для «Латинской Америки» (LA — Лаос) | | | официальное заявление сотрудника |
| 31 | Только страна, без языка (US, GB) | | | Google напрямую |
| 32 | be для Бельгии (be — белорусский язык) | | | Google напрямую |
| 33 | Одиночные коды страны ca, br, ch, us вместо язык-регион | | | вывод из правил |
| 34 | Обратный порядок: регион перед языком (GB-en, US-en) | | | вторичный источник |
| 35 | Трёхбуквенная страна вместо двухбуквенной (en-USA, ru-RUS) | | | вывод из правил |
| 36 | Перепутаны URL для pt-PT и pt-BR (оба кода валидны) | | | вывод из правил |
| 37 | Перепутаны язык и страна в значении (en-DE для немецкой версии вместо de-DE) | | | вывод из правил |
| 38 | Необычные пары язык-регион без реального контента под них | | | вторичный источник |
| 39 | zh-TW / zh-tw считают ошибкой (это допустимо, письменность выводится из страны) | | | Google напрямую |
| 40 | Устаревшие обозначения письменности zh-CHS и zh-CHT | | | вывод из правил |
| 41 | Лишний скрипт у языка с единственной письменностью (en-Latn, ru-Cyrl) | | | вывод из правил |
| 42 | sr-Latn считают ошибкой (корректный тег, но поддержка у Google прямо не подтверждена) | | | не подтверждено |
| 43 | Швейцарский немецкий gsw-CH вместо de-CH (поддержка gsw у Google не подтверждена) | | | вывод из правил |
| 44 | Регион для Яндекса по ISO 3166-2:RU в расчёте на Google | | | вывод из правил |
| 45 | de или de-DE: считают обязательным указывать регион | | | официальное заявление сотрудника |
| 46 | Подрегион по ISO 3166-2 вместо страны (en-US-CA) | | | официальное заявление сотрудника |
В. Формат и регистр · 8
| № | Ошибка | Неправильно | Правильно | Надёжность |
|---|---|---|---|---|
| 47 | Подчёркивание вместо дефиса (en_US, de_DE) | | | вторичный источник |
| 48 | Регистр считают значимым (en-us, EN-gb, X-Default): для Google он ничего не меняет | | | Google напрямую |
| 49 | Пробелы внутри значения hreflang | | | не подтверждено |
| 50 | Лишние дефисы и пустые подтеги (en--GB, en-GB-) | | | не подтверждено |
| 51 | Пустое значение hreflang или href | | | не подтверждено |
| 52 | Язык добавлен к x-default (x-default-en, en-x-default) | | | Google напрямую |
| 53 | Считают ошибкой hreflang без кавычек в заголовке Link | | | официальная документация (не Google) |
| 54 | Несколько значений через пробел в одном атрибуте hreflang | | | вывод из правил |
Г. Структура кластера · 28
| № | Ошибка | Неправильно | Правильно | Надёжность |
|---|---|---|---|---|
| 55 | Нет обратной ссылки (return tag): A ссылается на B, B на A не ссылается | | | Google напрямую |
| 56 | Нет обратной ссылки и неполный набор в заголовке Link у PDF | | | Google напрямую |
| 57 | Нет обратной ссылки в sitemap: запись одной версии не перечисляет другую | | | Google напрямую |
| 58 | Нет самоссылки: страница не перечисляет саму себя | | | Google напрямую |
| 59 | Нет самоссылки в sitemap: запись не содержит xhtml:link на свой же URL | | | Google напрямую |
| 60 | Повтор одного и того же значения на один и тот же URL | | | не подтверждено |
| 61 | Два разных URL на одно значение hreflang | | | официальное заявление сотрудника |
| 62 | Один URL указан под двумя разными языками | | | вторичный источник |
| 63 | Один и тот же язык/регион указан для разных страниц разными способами (HTML и sitemap) | | | официальное заявление сотрудника |
| 64 | Несколько x-default на одну страницу или кластер | | | официальное заявление сотрудника |
| 65 | x-default на главную, которая редиректит по языку или IP (одни источники называют ошибкой, Google допускает) | | | Google напрямую |
| 66 | x-default на страницу другого языка или не на селектор считают ошибкой | | | Google напрямую |
| 67 | Нет x-default (считают обязательным) | | | Google напрямую |
| 68 | Корень "/" редиректит по гео или языку, но не объявлен x-default | | | официальное заявление сотрудника |
| 69 | x-default без полного кластера языковых версий | | | официальное заявление сотрудника |
| 70 | Разные наборы hreflang на разных версиях страницы | | | Google напрямую |
| 71 | Нет «общей» страницы языка рядом с региональными | | | Google напрямую |
| 72 | Новая языковая версия не связана двусторонне с исходной | | | Google напрямую |
| 73 | В кластер включена ссылка на несуществующий перевод | | | вторичный источник |
| 74 | Конфликтные входящие аннотации: другая страница называет тот же URL другим языком | | | вторичный источник |
| 75 | Несколько самоссылок с разными значениями (en и en-US на себя же) | | | вторичный источник |
| 76 | hreflang не на каждой странице считают ошибкой (хотя Google разрешает частичное покрытие) | | | Google напрямую |
| 77 | Кластер из одной страницы: hreflang на сайте с единственной языковой версией | | | официальное заявление сотрудника |
| 78 | Hreflang связывает страницы, не являющиеся переводами друг друга (английская «Fish» и испанская «Chicken») | | | официальное заявление сотрудника |
| 79 | x-default указывает на страницу, не равную текущей по смыслу (товар ведёт на главную; свой x-default у каждого региона) | | | официальное заявление сотрудника |
| 80 | В набор включена версия, у которой ещё нет контента (/pl/ без страниц) | | | официальное заявление сотрудника |
| 81 | У страницы нет собственного адреса для проверки: ни canonical, ни метки URL | | | вывод из правил |
| 82 | Адрес страницы известен проверке только по rel=canonical, метки адреса в файле нет | | | вывод из правил |
Д. URL в аннотации · 19
| № | Ошибка | Неправильно | Правильно | Надёжность |
|---|---|---|---|---|
| 83 | Относительный URL в hreflang (/de-de/ вместо полного адреса) | | | Google напрямую |
| 84 | URL без схемы (protocol-relative) в hreflang или в <loc> | | | Google напрямую |
| 85 | В hreflang и sitemap указан HTTP-адрес, когда каноническая версия на HTTPS | | | Google напрямую |
| 86 | Адрес в hreflang отличается от канонического слэшем (/de-de вместо /de-de/) | | | вывод из правил |
| 87 | Альтернативный URL в hreflang отдаёт редирект (3xx) | | | вторичный источник |
| 88 | Альтернативный URL отдаёт 404 или 5xx | | | вторичный источник |
| 89 | Альтернативная страница закрыта noindex | | | официальное заявление сотрудника |
| 90 | Альтернативная страница закрыта в robots.txt | | | вторичный источник |
| 91 | В hreflang указан URL, у которого canonical ведёт на другой адрес | | | Google напрямую |
| 92 | Canonical всех языковых версий указывает на одну (английскую) страницу | | | Google напрямую |
| 93 | Canonical для одной страницы задан в sitemap и в rel=canonical разными адресами | | | Google напрямую |
| 94 | В hreflang-адрес попали параметры, которых нет в canonical | | | официальное заявление сотрудника |
| 95 | Кириллица в адресе без процентного кодирования | | | Google напрямую |
| 96 | Языковая версия через параметр URL (?loc=de) вместо отдельного пути | | | Google напрямую |
| 97 | Языковой поддомен считают самодостаточным сигналом аудитории | | | Google напрямую |
| 98 | Аннотации страницы ведут на главные страницы языков вместо соответствующих страниц | | | Google напрямую |
| 99 | Считают, что одна noindex-страница в кластере выключает hreflang у остальных версий | | | официальное заявление сотрудника |
| 100 | hreflang стоит на неканоническом URL (дубль с параметрами или другой вариант адреса) | | | официальное заявление сотрудника |
| 101 | Отдельные мобильные URL: hreflang мобильной версии ведёт на десктопные адреса | | | Google напрямую |
Е. Размещение и синтаксис · 39
| № | Ошибка | Неправильно | Правильно | Надёжность |
|---|---|---|---|---|
| 102 | Теги hreflang оказались в <body> (head закрылся раньше) | | | Google напрямую |
| 103 | Тег или скрипт в <head> до hreflang закрывает head, и ссылки уходят в body | | | вторичный источник |
| 104 | hreflang объединён с media в одном <link> | | | Google напрямую |
| 105 | hreflang на ссылке <a>, а не на <link> | | | официальное заявление сотрудника |
| 106 | rel="canonical" с атрибутом hreflang вместо rel="alternate" | | | Google напрямую |
| 107 | hreflang добавляется скриптом после загрузки (JS, GTM), а не лежит в исходном HTML | | | вторичный источник |
| 108 | Все три способа включены одновременно (HTML, заголовок, sitemap) | | | Google напрямую |
| 109 | Content-Language или meta content-language вместо hreflang | | | официальное заявление сотрудника |
| 110 | URL в заголовке Link без угловых скобок | | | Google напрямую |
| 111 | В заголовке Link нет rel="alternate" | | | Google напрямую |
| 112 | Относительный URL в заголовке Link | | | Google напрямую |
| 113 | Hreflang-набор разнесён по нескольким строкам Link: | | | не подтверждено |
| 114 | В <urlset> не объявлено пространство имён xhtml | | | Google напрямую |
| 115 | Опечатка в адресе пространства имён xhtml | | | вывод из правил |
| 116 | Неверное пространство имён корня sitemap (sitemap/0.84 вместо 0.9) | | | вывод из правил |
| 117 | Sitemap не в UTF-8 (декларация ISO-8859-1 или байты Latin-1) | | | Google напрямую |
| 118 | Не экранирован & в <loc> и в href | | | Google напрямую |
| 119 | Sitemap не well-formed (незакрытый <url>) | | | вывод из правил |
| 120 | Превышен лимит одного sitemap (50 000 URL или 50 МБ) без деления на файлы | | | Google напрямую |
| 121 | Дочерние xhtml:link считают в лимит 50 000 URL | | | Google напрямую |
| 122 | Sitemap лежит в подпапке, а перечисляет адреса из других папок | | | Google напрямую |
| 123 | В одном sitemap адреса с разных хостов без cross-submit | | | Google напрямую |
| 124 | В sitemap xhtml:link с rel="canonical" вместо rel="alternate" | | | вывод из правил |
| 125 | xhtml:link без атрибута hreflang | | | вывод из правил |
| 126 | Два элемента <url> с одним и тем же <loc> | | | вывод из правил |
| 127 | priority и changefreq в расчёте на влияние; lastmod обновляют у одной версии в расчёте на пере-обход набора | | | Google напрямую |
| 128 | lastmod в sitemap index не в формате W3C Datetime | | | Google напрямую |
| 129 | Sitemap index ссылается на файл, которого нет, или <sitemap> без <loc> | | | вывод из правил |
| 130 | Sitemap с hreflang не заявлен в Search Console и robots.txt | | | вторичный источник |
| 131 | Считают, что записи одного кластера нельзя делить между файлами sitemap | | | официальное заявление сотрудника |
| 132 | hreflang размещают только в sitemap в расчёте на Яндекс | | | официальная документация (не Google) |
| 133 | <noscript> с iframe в <head> выше hreflang: head закрывается раньше, ссылки уходят в body | | | Google напрямую |
| 134 | Файл sitemap с hreflang упирается в 50 МБ раньше, чем в 50 000 URL | | | Google напрямую |
| 135 | xhtml:link стоит вне элемента <url> | | | не подтверждено |
| 136 | hreflang размещён только в sitemap index | | | не подтверждено |
| 137 | Фрагмент (#…) в адресе значения hreflang | | | не подтверждено |
| 138 | <url> без <loc> | | | вывод из правил |
| 139 | hreflang прописывают в robots.txt | | | вывод из правил |
| 140 | Набор Link у одной версии PDF отличается от остальных | | | Google напрямую |
Ж. CMS и сборки · 34
| № | Ошибка | Неправильно | Правильно | Надёжность |
|---|---|---|---|---|
| 141 | Ждут hreflang от SEO-плагина без плагина-переводчика (Yoast SEO, Rank Math) | | | официальная документация (не Google) |
| 142 | Ищут hreflang от WPML в head, а он по умолчанию записан в XML-sitemap | | | вторичный источник |
| 143 | Включили вывод hreflang в head (WPML) и не отключили вывод в sitemap | | | вторичный источник |
| 144 | Shopify: свои hreflang-теги поверх автоматических | | | официальная документация (не Google) |
| 145 | Shopify: домены и handle товара прописаны в теме вручную | | | официальная документация (не Google) |
| 146 | Shopify: ждут hreflang для рынка без отдельного домена, поддомена или подпапки | | | официальная документация (не Google) |
| 147 | Next.js: относительные пути в alternates.languages без metadataBase | | | официальная документация (не Google) |
| 148 | Next.js: одинаковый набор alternates.languages задан в общем layout для всех страниц | | | вывод из правил |
| 149 | Nuxt i18n: не заданы language у локалей и baseUrl с продакшн-доменом | | | официальная документация (не Google) |
| 150 | Nuxt i18n: не учитывают автоматическую «catchall»-ссылку для группы локалей (en-*) | | | официальная документация (не Google) |
| 151 | Django: sitemap без i18n=True и alternates=True (или без x_default) | | | официальная документация (не Google) |
| 152 | Django: x-default строится без языкового префикса, а такой URL не отдаёт страницу | | | вывод из правил |
| 153 | Laravel (spatie/laravel-sitemap): добавлены только «чужие» языки без самоссылки | | | вывод из правил |
| 154 | Joomla: не заполнены Associations, поэтому hreflang не выводится | | | официальная документация (не Google) |
| 155 | Tilda: переключатель языков есть, hreflang не вставлен | | | официальная документация (не Google) |
| 156 | 1С-Битрикс: один тег на страницу без самоссылки и обратных ссылок | | | вторичный источник |
| 157 | Magento 2: CMS-страницы и главная без группы альтернатив | | | вторичный источник |
| 158 | Magento 2: версия с noindex выпадает из набора ссылок | | | вторичный источник |
| 159 | WPML и Yoast: hreflang выводится для страниц, закрытых noindex в Yoast | | | не подтверждено |
| 160 | Плагин CMS выставляет canonical на чужой URL | | | Google напрямую |
| 161 | Новая CMS по умолчанию добавила hreflang на сайт без международных страниц | | | вторичный источник |
| 162 | Polylang: ждут x-default на внутренних страницах | | | официальная документация (не Google) |
| 163 | Polylang: есть только en-GB и en-US, общей en-страницы нет | | | официальная документация (не Google) |
| 164 | WPML выводит hreflang в начале head, а тема или плагин вставляет выше него iframe или другой тег | | | официальная документация (не Google) |
| 165 | WPML не проверяет код региона, введённый вручную в поле языка | | | Google напрямую |
| 166 | TranslatePress: в справке пример кода региона «en-UK» | | | Google напрямую |
| 167 | Плагин перевода не добавляет x-default по умолчанию (Weglot; в TranslatePress отдельная опция) | | | официальная документация (не Google) |
| 168 | Сайт за reverse proxy: hreflang и переключатель языков указывают на внутренний домен | | | официальная документация (не Google) |
| 169 | Drupal: ждут hreflang на всех страницах от ядра | | | официальная документация (не Google) |
| 170 | Drupal 9.4 и новее: ищут hreflang в HTTP-заголовках ответа | | | официальная документация (не Google) |
| 171 | PrestaShop: у бельгийского магазина регион языка nl-NL вместо nl-BE | | | вторичный источник |
| 172 | Hugo: x-default по шаблону указывает на первый язык из конфигурации | | | вторичный источник |
| 173 | Сторонний модуль Magento молча исключает store view без кода языка | | | вторичный источник |
| 174 | WPML SEO 2.2.2 выводил в sitemap коды региона без языка (nz, au) | | | вторичный источник |
З. Концептуальные ошибки · 29
| № | Ошибка | Неправильно | Правильно | Надёжность |
|---|---|---|---|---|
| 175 | Ждут роста позиций от внедрения hreflang | | | официальное заявление сотрудника |
| 176 | «Одна мелкая ошибка отключает hreflang на всём сайте» | | | официальное заявление сотрудника |
| 177 | Ошибку hreflang считают причиной выпадения страницы из индекса | | | официальное заявление сотрудника |
| 178 | Язык или регион меняют на одном URL по cookie, Accept-Language или IP | | | Google напрямую |
| 179 | Автоматический редирект на локальную версию по IP, языку браузера или cookie | | | Google напрямую |
| 180 | Языковые версии массово создают машинным переводом без проверки | | | Google напрямую |
| 181 | hreflang раскатывают на весь сайт «на всякий случай», хотя неверные версии в выдаче не показываются | | | официальное заявление сотрудника |
| 182 | hreflang считают единственным или определяющим сигналом геотаргетинга | | | Google напрямую |
| 183 | Сайты или папки разных стран с одним и тем же английским текстом, без hreflang и canonical | | | Google напрямую |
| 184 | Считают, что hreflang гарантирует показ нужной версии | | | официальное заявление сотрудника |
| 185 | <html lang> считают заменой hreflang или сигналом языка для Google | | | Google напрямую |
| 186 | Региональные копии на одном языке считают источником штрафа за дубли | | | Google напрямую |
| 187 | Ищут официальный валидатор hreflang Google или отчёт International Targeting | | | Google напрямую |
| 188 | Разметку выкатывают без теста и не следят за ней после релиза | | | вторичный источник |
| 189 | Разметку копируют у конкурента без проверки | | | вторичный источник |
| 190 | hreflang для новостных публикаций, где взаимность подтверждается с задержкой | | | вторичный источник |
| 191 | При миграции или смене CMS hreflang пропадает на части страниц | | | официальное заявление сотрудника |
| 192 | В материалах цитируют проценты ошибок hreflang без первоисточника («72%», «40%», «90%») | | | вторичный источник |
| 193 | Ждут, что языковые версии делятся сигналами и ссылочным весом через hreflang | | | официальное заявление сотрудника |
| 194 | Редирект на локальную версию кодом 301 или со всех страниц, а не только с корня кодом 302 | | | Google напрямую |
| 195 | Копируют каждую страницу на десятки страновых версий «ради охвата» | | | официальное заявление сотрудника |
| 196 | Приписывают hreflang просадку или рост трафика, не проверив другие причины | | | вторичный источник |
| 197 | Считают зелёный Lighthouse признаком корректного hreflang | | | Google напрямую |
| 198 | Проверяют hreflang инструментом, который не видит sitemap или JavaScript, и делают вывод «hreflang нет» | | | официальное заявление сотрудника |
| 199 | Переносят структуру сайта «как Google, перешедший с доменов стран на единый домен» | | | официальное заявление сотрудника |
| 200 | Блокируют автоматически переведённые страницы в robots.txt по старой справке | | | Google напрямую |
| 201 | Две страны на одном языке с одинаковым текстом и ценой: ждут, что Google проиндексирует обе | | | официальное заявление сотрудника |
| 202 | Миграция доменов стран в подпапки: на старых сайтах hreflang не было, на новом он с четырьмя проблемами, редиректы не покрыли все адреса | | | вторичный источник |
| 203 | Считают, что кластер не работает, пока Google не увидел все версии сразу | | | официальное заявление сотрудника |
И. Другие поисковики и ИИ-ответы · 5
| № | Ошибка | Неправильно | Правильно | Надёжность |
|---|---|---|---|---|
| 204 | Редирект между языковыми или региональными поддоменами по IP, языку или cookie: Яндекс склеивает их в группу сайтов | | | официальная документация (не Google) |
| 205 | Языковые поддомены с одинаковым текстом без регионального задания и альтернативных ссылок (справки Яндекса расходятся: дубли или конкуренция) | | | официальная документация (не Google) |
| 206 | Рассчитывают на hreflang в Baidu и Naver | | | вторичный источник |
| 207 | Считают, что Bing не поддерживает hreflang | | | официальная документация (не Google) |
| 208 | Ждут, что hreflang управляет языком и страной в ИИ-ответах (AI Overviews, AI Mode, ChatGPT, Perplexity) | | | не подтверждено |
По этим условиям строк нет. Сбросьте фильтры или измените запрос.
Порядок проверки своего hreflang
- Решите, нужен ли онЕсли в выдаче нет чужой версии и страны не конкурируют друг с другом, можно не внедрять. Это не ошибка, как показали источники выше.
- Выберите один способHTML для небольших сайтов и для Яндекса (sitemap он для языковых версий не поддерживает), sitemap для больших каталогов только под Google, заголовок для PDF. Если нужны оба поисковика, базовый способ HTML; sitemap поверх него допустим при совпадающих наборах. Расхождения реальны: у 9 из 26 сайтов с двумя способами наборы различаются.
- Проверьте кодыЯзык ISO 639-1, регион ISO 3166-1 Alpha 2, без
UK,EU,es-419, подчёркиваний и трёхбуквенных кодов. Регистр приведите кen-GB. - Соберите кластер целикомКаждая страница перечисляет себя и всех остальных, набор одинаков, ссылки взаимные, все адреса абсолютные.
- Сверьте canonical, редиректы и
noindexКаждая страница кластера отвечает 200, индексируется и ведёт canonical на себя. - Проверьте отрисованный HTMLЧерез «Проверить URL → Просмотреть проверенную страницу» в Search Console: теги hreflang должны быть внутри
head. - Следите за результатом в выдачеОткройте поиск с параметрами страны и языка (
gl=,hl=) и посмотрите, какая версия показывается.
Эталонный код этой статьи и валидатор на Python (стандартная библиотека, без установки пакетов) лежат в одном архиве. Валидатор проверяет коды по реестру IANA, самоссылку, возвратные ссылки, формат URL, canonical, дубли, синтаксис заголовка и sitemap. В архиве есть сломанная копия эталона с 55 поломками: на ней проверено, что каждая находится. Чего валидатор не делает: не ходит по сети, не проверяет коды ответа, noindex и robots.txt, а нулевой результат означает соответствие описанным правилам, а не гарантию, что Google примет разметку.
Скачать эталон и валидатор (ZIP)
python -X utf8 check_hreflang.py <папка или файл>Яндекс, Bing и ИИ-поиск
Яндекс
Справка Вебмастера описывает разметку в head, ссылки на все версии на каждой странице и двухбуквенные коды ISO 639-1. Регион — ISO 3166-1 Alpha-2 или ISO 3166-2:RU для регионов России. Список поддерживаемых языков короткий, 40 кодов, и в нём нет китайского, японского, корейского, хинди и тайского. Sitemap для языковых версий Яндекс больше не поддерживает. Дата обновления на странице справки не указана.
Bing
Блог Bing от 19 декабря 2025 года советует использовать hreflang для языкового и регионального таргетинга. Справки Merkle и Conductor (последняя обновлена 23 марта 2026 года) всё ещё утверждают, что Bing разметку не поддерживает, и блог Bing с ними расходится: проверяйте на своём сайте. Как Bing обрабатывает разметку, он не описывает.
ИИ-ответы
Официального заявления о том, как hreflang работает в AI Mode и AI Overviews, я не нашёл: проверены документация, высказывания Мюллера, Bluesky и Reddit. Есть наблюдения отдельных специалистов на малых выборках, но это не правила.
Baidu и Naver
Официальных справок по hreflang я не нашёл. Вторичные источники расходятся (в одних Naver не поддерживает hreflang, в других про sitemap сказано «will still work»), поэтому проверяйте на своём сайте.
Если у вас международный сайт и нужен разбор hreflang, напишите мне. Начну с проверки отрисованного HTML и canonical на выборке страниц по каждому рынку, потом соберу кластеры и сверю с Search Console. Формат работы — на странице «Услуги».
Состав данных и ограничения статьи
- База источников: документация Google (страницы открыты 19 октября 2026 года, главная страница про hreflang обновлена 21 сентября 2026 года), высказывания сотрудников Google на Reddit, в office hours и подкастах, RFC 5646, реестр IANA, справки Яндекса и Bing, исследования Ahrefs, Semrush, Search Engine Land, seotal и Web Almanac, кейс Clarks от Sistrix, справки инструментов проверки.
- Reddit напрямую недоступен, поэтому комментарии Мюллера и Иллиса прочитаны в архиве; цитаты даны дословно, даты — по времени комментария. Цитаты Мюллера из видео (2019–2021) взяты из автоматических субтитров.
- Поведение Google в 2026 году на живых сайтах я не тестировал: эталон основан на документации, а не на эксперименте.
- Измерения вреда от самих ошибок hreflang для органического трафика нет ни в моей работе, ни в источниках. Утверждения вида «ошибка снижает трафик на X%» в статье не приводятся.
- Замер на 912 сайтах описывает главные страницы крупных доменов, а не интернет в целом.
Частые вопросы
Если у сайта одна версия контента, нет: Мюллер (Google) говорит, что тогда разметка «doesn’t do anything anyway». Если на одном языке есть отдельные версии для разных стран (например, ru-RU и ru-KZ), да: это один из основных случаев, где она оправдана.
По высказываниям Google, нет: разметка подставляет пользователю нужную версию вместо найденной и ранжирование не меняет. Версии на разных языках не делятся сигналами между собой.
Для Google нет: значение нечувствительно к регистру, принимаются строчные и заглавные коды. По конвенции ISO регион пишут заглавными (en-GB), язык строчными. Среди аннотаций с валидным кодом 23,2% записаны строчными, и это не нарушение.
Google игнорирует пару: «If two pages don’t both point to each other, the tags will be ignored». Остальные пары кластера продолжают работать. В моём замере хотя бы у одной проверенной альтернативы ссылки назад нет у 82 из 814 сайтов (10,1%); из sitemap возврат я не проверял, поэтому это верхняя оценка.
Это рекомендация, а не требование. x-default задаёт запасную страницу для пользователей, чей язык не совпал ни с одной версией; лучше всего он работает на странице выбора языка. В замере x-default нет у 28,7% сайтов с hreflang.
Для Google три способа равнозначны. HTML-теги подходят небольшим сайтам и нужны для Яндекса, sitemap удобнее для больших каталогов только под Google, заголовок Link нужен для PDF. Если нужны оба поисковика, базовый способ HTML. Конфликт возникает, если один код ведёт на разные URL; в моей подвыборке наборы различаются у 9 из 26 сайтов с двумя способами.
Справка Вебмастера описывает разметку в head и двухбуквенные коды ISO 639-1. Список поддерживаемых языков короткий (40 кодов), sitemap для языковых версий Яндекс больше не поддерживает. Даты обновления на странице справки нет.
Источники
Страницы открыты 19 октября 2026 года. Где у страницы есть дата обновления, она указана. Комментарии Джона Мюллера и Гэри Иллиса на Reddit прочитаны в архиве, ссылок на них нет.
- Tell Google about localized versions of your page (обновлено 21.09.2026)
- Managing multi-regional and multilingual sites (обновлено 10.12.2025)
- How to specify a canonical URL (обновлено 10.07.2026)
- Search Central office hours, ноябрь 2022
- Search Central office hours, январь 2023
- Search Central office hours, июль 2023
- Search Off the Record: Internationalization and hreflang (25.07.2024)
- Hunting a heinous hreflang headache (SEO Fairy Tales, 2022)
- Стрим Мюллера: конфликт HTML и sitemap (27.11.2020)
- Office hours Мюллера (18.06.2021)
- Office hours Мюллера (13.08.2021)
Стандарты
Яндекс и Bing
- Яндекс Вебмастер: локализованные страницы (даты обновления нет)
- Bing Webmaster Blog: Does Duplicate Content Hurt SEO and AI Search Visibility? (19.12.2025)