Hreflang подсказывает Google, какую языковую или региональную версию страницы кому показывать: пользователю с украинским интерфейсом отдать /ua/, с английским /en/. Без этой разметки многоязычный сайт часто ранжируется «не той» версией: в выдаче для Польши всплывает украинская страница, а английская вообще не воспринимается как отдельная. Ниже разбираем, что атрибут hreflang делает на самом деле, три способа его прописать, какие коды языков и регионов корректны, и где многоязычные сайты обычно ломают разметку.

Атрибут hreflang связывает между собой страницы с одинаковым содержанием на разных языках или для разных стран. Google читает эту связь и для каждой страны или языка интерфейса подставляет в выдачу наиболее подходящую версию. Ключевое слово здесь «подставляет»: все версии уже должны быть проиндексированы, hreflang лишь помогает выбрать одну из них под конкретного пользователя.
Чего hreflang не делает, и именно здесь больше всего путаницы:
/en/ остался украинский текст, Google это увидит, а hreflang ничем не поможет.Практический вывод простой. Если у вас один язык и один рынок, hreflang не нужен вовсе. Он нужен, когда есть хотя бы две языковые версии или один язык для нескольких стран с разными ценами или доставкой (en-US и en-GB, например).
Google принимает разметку из трёх источников, и все три равноценны. Выбирать нужно один способ на весь сайт, потому что смешивание даёт конфликты, которые потом трудно найти.
Самый распространённый вариант для сайтов на CMS. На каждой версии страницы в <head> перечисляют все версии, включая её саму:
<link rel="alternate" hreflang="uk" href="https://site.ua/ua/dostavka/" />
<link rel="alternate" hreflang="ru" href="https://site.ua/dostavka/" />
<link rel="alternate" hreflang="en" href="https://site.ua/en/delivery/" />
<link rel="alternate" hreflang="x-default" href="https://site.ua/ua/dostavka/" />
Плюс: видно в коде, легко проверить глазами. Минус: на сайте с 20 000 страниц и пятью языками каждая страница получает пять-шесть строк, поэтому это должна генерировать CMS, а не руки.
Для файлов без HTML, например PDF-каталогов, в ответе сервера отдают заголовок:
Link: <https://site.ua/ua/catalog.pdf>; rel="alternate"; hreflang="uk", <https://site.ua/en/catalog.pdf>; rel="alternate"; hreflang="en"
Редкий способ, настраивается на уровне сервера. Для обычных страниц им не пользуются.
Каждый <url> в карте сайта дополняют элементами <xhtml:link> со списком всех версий. Пример для одной страницы:
<url><loc>https://site.ua/ua/dostavka/</loc><xhtml:link rel="alternate" hreflang="uk" href="https://site.ua/ua/dostavka/"/><xhtml:link rel="alternate" hreflang="en" href="https://site.ua/en/delivery/"/></url>
Плюс: HTML страниц не «пухнет», всё лежит в одном файле, который удобно генерировать и проверять скриптом. Минус: карта растёт, и на больших каталогах её приходится дробить на несколько файлов. Мы в Query для магазинов с десятками тысяч страниц чаще выбираем именно sitemap, для небольших сайтов услуг удобнее link в head.
Взаимность означает: если страница A указывает на страницу B как на английскую версию, то страница B должна указывать на A как на украинскую. Одностороннюю связь Google игнорирует полностью, и это самая частая причина, почему «hreflang прописали, а ничего не изменилось». Проверять нужно именно пары, а не отдельные страницы.
x-default говорит, какую версию показывать тем, чей язык и страна не совпадают ни с одной из перечисленных. Для украинского сайта с uk/ru/en логично отдавать в x-default либо английскую версию (для иностранцев), либо страницу выбора языка, если она есть. Ставить x-default на украинскую тоже допустимо: тогда неопределённые пользователи увидят основную версию. Главное, чтобы x-default был один и вёл на реальную страницу с кодом 200.
Язык записывается по ISO 639-1 (две буквы), регион по ISO 3166-1 Alpha-2 после дефиса. Регион без языка указывать нельзя: hreflang="UA" невалиден, нужно uk-UA. Больше всего ошибок делают с украинским: его код uk, а не ua. Значение ua это домен, а не язык, и Google его не распознаёт.
| Код | Что означает | Когда уместен |
|---|---|---|
| uk | Украинский, любая страна | Стандарт для украинской версии |
| uk-UA | Украинский для Украины | Только при наличии другой украинской версии |
| ru | Русский, любая страна | Версия без привязки к стране |
| en | Английский, любая страна | Один английский для всех |
| en-GB, en-US | Английский для Британии / США | Разные цены, валюта, доставка |
| x-default | Версия «для всех остальных» | Один раз в каждом наборе |
Если у вас одна английская версия, пишите просто en. Дописывать регион «про запас» не стоит: en-US сужает аудиторию, и британский пользователь формально под неё не попадает, хотя Google и пытается подобрать ближайший язык.
По нашим наблюдениям, на большинстве сайтов, которые приходят на техническую оптимизацию, разметка либо есть с ошибками, либо её нет вообще. Ошибки повторяются от сайта к сайту.
| Ошибка | Чем грозит | Как исправить |
|---|---|---|
| Нет обратной ссылки | Google игнорирует пару | Один список версий для всех страниц |
| Ведёт на неканоническую страницу | Сигналы противоречат | Только канонические URL |
| Относительные URL | Разметка невалидна | Абсолютные адреса с доменом |
| Конфликт с canonical | Версия исчезает из выдачи | Каждая версия канонична сама на себя |
| Разные языки на одном URL | Google не связывает версии | Один язык = один адрес |
| Код ua вместо uk | Версия без разметки | Заменить код в шаблоне |
| Ведёт на noindex, 404, редирект | Пара распадается | Проверять версии перед выводом |
| Перевода нет, hreflang есть | Ссылка на несуществующее | Только реально переведённые страницы |

&gl=gb&hl=en и посмотрите, какая версия в выдаче. Это самый честный тест.Официальные требования и примеры для всех трёх способов собраны в документации Google о локализованных версиях. Если валидатор и документация расходятся, прав Google.
Типичная конфигурация украинского бизнеса: украинский основной, русский для части аудитории, английский для экспорта или иностранных клиентов. Несколько практических рекомендаций, которые мы даём в таких проектах.
/ua/, но последовательно по всему сайту. Смешанная структура, где часть страниц с префиксом, а часть без, разрушает разметку.ru без региона. ru-UA оправдан только тогда, когда есть ещё ru-версия для другой страны.uk, а не ua.Hreflang не добавляет позиций, он убирает потери. Когда правильная версия показывается правильному пользователю, растёт CTR и исчезают отказы «не тот язык». Для сайта с двумя-тремя языками это один-два дня работы разработчика и полдня на проверку, и эта инвестиция окупается стабильно.