hreflang для мультиязычного сайта: гайд и примеры
Атрибут hreflang — это разметка, которая говорит Google и Яндексу: «страница переведена на другой язык, вот альтернативные версии». Без него мультиязычный сайт начинает конкурировать сам с собой: русская и украинская версии одного товара оказываются в выдаче по одному запросу, а поисковик выбирает ту, которая, по его мнению, ближе пользователю — не всегда правильно.
В гайде разбираем синтаксис hreflang, три способа внедрения (HTML-тег, HTTP-заголовок, XML-sitemap), готовые примеры для двуязычного блога и магазина с русским, украинским и казахским контентом, топ-5 ошибок рунета и инструменты проверки. В конце — ответы на 6 частых вопросов о совместимости с canonical и особенностях Яндекса.
Что такое hreflang и когда он нужен
hreflang — атрибут HTML-тега <link>, в котором указан язык и, по желанию, регион альтернативной версии страницы. Поисковик читает разметку и понимает: /ru/product и /en/product — это не дубли, а две языковые версии одной страницы. В выдачу попадает та, которая соответствует языку пользователя и его географии.
Разметка нужна в трёх случаях. Первый — сайт переведён на несколько языков: блог, документация, лендинг с русской и английской версиями. Второй — один язык, но разные региональные версии: цены в рублях для России и в тенге для Казахстана. Третий — мультидоменная конфигурация: example.ru, example.com.ua, example.kz — отдельные домены для разных рынков, но с родственным контентом.
Если сайт одноязычный, hreflang не нужен. Если русскоязычных пользователей обслуживают 2–3 региональные версии без перевода — тоже можно обойтись, но Google и Яндекс корректнее распределят трафик с разметкой, чем без неё. Отсутствие hreflang — это не ошибка, а упущенная возможность.
Синтаксис: коды языков и регионов
Значение атрибута — двух- или трёхсимвольный код по стандарту ISO 639-1 (язык) и, опционально, код региона по ISO 3166-1 alpha-2 через дефис. Примеры корректных значений:
| Код | Значение | Пример URL |
|---|---|---|
ru | Русский (любой регион) | https://example.com/ru/page |
en | Английский (любой регион) | https://example.com/en/page |
ru-RU | Русский для России | https://example.com/ru-ru/page |
ru-UA | Русский для Украины | https://example.com/ru-ua/page |
uk | Украинский | https://example.com/uk/page |
x-default | Фолбэк для всех неперечисленных | https://example.com/ |
Код языка пишется строчными буквами, код региона — заглавными: ru-RU, а не ru-ru (хотя Google принимает оба варианта, в спецификации — заглавные). x-default — зарезервированное значение для страницы, которую поисковик покажет пользователю из языка или региона, не перечисленных в разметке.
Важно: hreflang указывает именно на язык, а не на страну. en-GB и en-US — английский для Великобритании и США, но если на сайте одна английская версия, используйте en без региона. Попытка «подстраховаться» и указать оба кода одновременно приведёт к конфликту — поисковик не поймёт, какая версия приоритетна.
Три способа внедрения
hreflang можно разместить в одном из трёх мест: HTML-тегах страницы, HTTP-заголовке ответа, XML-sitemap. Выбор зависит от размера сайта, типа контента и возможностей CMS.
| Метод | Где размещается | Когда подходит | Сложность | Лимит |
|---|---|---|---|---|
HTML <link> |
<head> страницы |
До 10–15 языковых версий | Низкая | Замедляет парсинг при сотнях ссылок |
HTTP-заголовок Link: |
Ответ сервера | PDF, изображения, не-HTML | Средняя | Нет |
| XML-sitemap | Отдельный файл | 20+ локалей, крупные сайты | Высокая | 50 000 URL на файл |
HTML-тег
Самый распространённый способ. В <head> каждой языковой версии добавляется полный набор <link rel="alternate"> на все версии, включая саму себя (самореферентная ссылка — обязательна).
<link rel="alternate" hreflang="ru" href="https://example.com/ru/">
<link rel="alternate" hreflang="en" href="https://example.com/en/">
<link rel="alternate" hreflang="ru-UA" href="https://example.com/ru-ua/">
<link rel="alternate" hreflang="ru-KZ" href="https://example.com/ru-kz/">
<link rel="alternate" hreflang="de" href="https://example.com/de/">
<link rel="alternate" hreflang="x-default" href="https://example.com/">
Набор одинаковый на всех языковых версиях страницы. Самое частое место поломки — когда страница /ru/ указывает hreflang="ru" только на саму себя, а про /en/ забывает.
HTTP-заголовок
Для не-HTML ресурсов — PDF, DOC, картинки — HTML-тегов нет, но hreflang всё равно нужен. Серверу настраивается заголовок Link::
Link: <https://example.com/ru/guide.pdf>; rel="alternate"; hreflang="ru",
<https://example.com/en/guide.pdf>; rel="alternate"; hreflang="en",
<https://example.com/guide.pdf>; rel="alternate"; hreflang="x-default"
Настройка — в конфиге Nginx (add_header Link), Apache (Header set Link) или через middleware приложения. Для большинства сайтов этот способ актуален только для раздела с документацией.
XML-sitemap
Для крупных сайтов — интернет-магазин с десятками тысяч страниц и 5+ языками — разметка в HTML каждой страницы приводит к раздутому <head>. Решение — вынести hreflang в XML-sitemap. Подробнее — в разделе про sitemap ниже.
Готовые примеры для разных сайтов
Три сценария, которые встречаются в 90% случаев.
Двуязычный блог RU / EN
Самая простая конфигурация. На каждой статье блога — 3 строки <link>:
<link rel="alternate" hreflang="ru" href="https://example.com/ru/blog/article">
<link rel="alternate" hreflang="en" href="https://example.com/en/blog/article">
<link rel="alternate" hreflang="x-default" href="https://example.com/ru/blog/article">
x-default указывает на русскую версию — её увидят пользователи из Франции, Германии и других стран, где нет отдельного перевода.
Интернет-магазин RU / UA / KZ
Один язык, три региональных версии с разными ценами, валютами и складами:
<link rel="alternate" hreflang="ru-RU" href="https://example.com/ru-ru/product/42">
<link rel="alternate" hreflang="ru-UA" href="https://example.com/ru-ua/product/42">
<link rel="alternate" hreflang="ru-KZ" href="https://example.com/ru-kz/product/42">
<link rel="alternate" hreflang="x-default" href="https://example.com/product/42">
Google покажет ru-KZ пользователю из Казахстана, ru-UA — из Украины, ru-RU — из России. Остальные увидят x-default (каноническая версия без региона).
Международный B2B на разных доменах
Компания с отдельными доменами по рынкам: example.ru, example.com, example.de. Разметка работает между доменами так же, как внутри одного:
<link rel="alternate" hreflang="ru" href="https://example.ru/">
<link rel="alternate" hreflang="en" href="https://example.com/">
<link rel="alternate" hreflang="de" href="https://example.de/">
<link rel="alternate" hreflang="x-default" href="https://example.com/">
Обязательное условие — взаимность: страница на example.ru ссылается на example.com, а example.com — на example.ru. Без этого Google проигнорирует разметку.
hreflang в XML-sitemap
Для крупного сайта с десятками локалей HTML-подход становится тяжёлым: на странице с 30 языковыми версиями в <head> уходит 30 строк <link>, и так на каждой из 100 000 страниц. Вынос hreflang в XML-sitemap решает проблему: разметка централизованно описана в одном файле.
<?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/ru/product/42</loc>
<xhtml:link rel="alternate" hreflang="ru" href="https://example.com/ru/product/42"/>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/product/42"/>
<xhtml:link rel="alternate" hreflang="uk" href="https://example.com/uk/product/42"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/product/42"/>
</url>
</urlset>
Правила те же, что и для HTML-тега: самореферентность (каждый <url> содержит <xhtml:link> на себя), взаимность между версиями, x-default для фолбэка. Google и Яндекс читают <xhtml:link> как эквивалент HTML-тега.
Sitemap-подход совместим с HTML-тегом: можно описать hreflang только в sitemap, только в HTML или продублировать — поисковики предпочтут более свежие данные. Для sitemap действуют общие лимиты — до 50 000 URL и 50 МБ в одном файле. Подробности о структуре sitemap — в статье «sitemap.xml: как создать, разместить и проверить». Сам файл sitemap объявляется в robots.txt директивой Sitemap: — см. гайд по robots.txt. Сгенерировать sitemap с hreflang автоматически можно в генераторе sitemap SEO Crawler.
Топ-5 ошибок hreflang
Пять проблем, которые встречаются на каждом втором мультиязычном сайте.
- Страница не ссылается на саму себя. Каждая языковая версия должна включать
<link>на собственный URL. Без самореферентной ссылки Google не считает разметку валидной и игнорирует весь набор. - Односторонние ссылки.
/ru/ссылается на/en/, но/en/не ссылается на/ru/. Разметка обязана быть взаимной — это главное правило. В Google Search Console такие пары показываются в отчёте «International Targeting» как ошибки без пары. - Неверные коды регионов. Частая путаница:
ru-RU-ru,russian,ru_RU(с подчёркиванием),ru-RUS(трёхбуквенный код страны). Принимается только формат «язык-РЕГИОН», где язык — ISO 639-1, регион — ISO 3166-1 alpha-2. - Отсутствует
x-default. Некритичная ошибка, но безx-defaultпоисковик сам решает, какую версию показать пользователю из неперечисленного региона. Решение не всегда удачное — проще указать явно. - Конфликт с canonical. Страница
/ru/productуказываетcanonicalна/en/productи одновременно даёт на неёhreflang. Canonical говорит: «это дубль», hreflang — «это альтернатива». Противоречие, Google проигнорирует обе разметки. Правильно: canonical — на себя, hreflang — на все версии.
Неправильный пример из реальной практики:
<!-- На странице /ru/product: НЕ ДЕЛАЙТЕ ТАК -->
<link rel="canonical" href="https://example.com/en/product">
<link rel="alternate" hreflang="en" href="https://example.com/en/product">
<!-- забыт самореферентный <link hreflang="ru" ...> -->
hreflang vs canonical vs alternate
Три механизма работают с разными задачами, и их часто путают. canonical говорит: «эта страница — дубль, основная версия — здесь». alternate без hreflang — «есть альтернативная версия» (мобильная, AMP). hreflang — «есть версия на другом языке».
Правильная комбинация для мультиязычной страницы:
<!-- На странице https://example.com/ru/product -->
<link rel="canonical" href="https://example.com/ru/product">
<link rel="alternate" hreflang="ru" href="https://example.com/ru/product">
<link rel="alternate" hreflang="en" href="https://example.com/en/product">
<link rel="alternate" hreflang="x-default" href="https://example.com/">
Canonical указывает на себя (страница не является дублем другой — она оригинальная версия на своём языке). Hreflang описывает все переводы, включая текущий. Это корректная разметка, которую принимают и Google, и Яндекс.
Дополнительный слой — структурированные данные Schema.org. Они не заменяют hreflang, но помогают поисковику лучше понять контент страницы. Подробнее — в гайде по Schema.org и JSON-LD.
Как проверить hreflang
Четыре уровня проверки — от страницы до всего сайта.
Первая — ручная, через view-source: в браузере. Откройте страницу, посмотрите исходный код, найдите блок <link rel="alternate" hreflang=...>. Проверьте: самореферентная ссылка есть, все языки перечислены, коды корректные, URL рабочие.
Вторая — Google Search Console. В отчёте «International Targeting → Language» показываются ошибки по всему сайту: страницы без самореферентности, пары без взаимности, неизвестные коды языков. Обновляется с задержкой в несколько дней после обхода.
Третья — Яндекс.Вебмастер. Яндекс не учитывает hreflang в полной мере, но проверяет синтаксис разметки в разделе «Индексирование → Страницы в поиске». Для русско-украинских и русско-казахских пар полезнее — Яндекс.Вебмастер → «Региональность» (явное указание региона сайта).
Четвёртая — автоматическая по всему сайту. На сайте с 500+ страницами проверить каждую вручную невозможно. Валидатор hreflang в SEO Crawler обходит сайт, проверяет взаимность ссылок между всеми языковыми версиями, находит несамореферентные записи и конфликты с canonical — в одном отчёте.
Официальная документация — Google Search Central о локализованных версиях.
Часто задаваемые вопросы
hreflang обязателен для мультиязычных сайтов?
Формально — нет. Сайт без разметки будет индексироваться, и Google попытается сам понять, какая страница на каком языке. На практике без hreflang мультиязычные страницы начинают конкурировать за одни и те же запросы: в выдаче может оказаться английская версия, когда пользователь ищет на русском. Для сайтов с двумя и более языками — это обязательная разметка.
Что такое x-default и обязателен ли он?
x-default указывает фолбэк-версию страницы для языков и регионов, которых нет в вашем списке. Типичный сценарий: сайт переведён на русский, английский, украинский. Пользователь из Франции заходит на страницу — какую версию ему показать? Без x-default решает Google. С x-default — видит ту, которую вы явно назначили (обычно английскую или наиболее нейтральную).
hreflang или поддомены — что лучше для разных языков?
Это разные вещи. hreflang — разметка, которая сообщает поисковику о связях между страницами. Поддомены (en.example.com) или подпапки (example.com/en/) — структура URL. Они совместимы и обычно используются вместе: выбирается структура (подпапки рекомендуются Google как более простые для SEO), а внутри неё размечается hreflang.
Разрешён ли hreflang между разными доменами?
Да. Сайт на example.ru, example.com и example.de может связать страницы между собой через hreflang — это рабочий сценарий для международных брендов. Главное условие — взаимность: если example.ru ссылается на example.com, то example.com обязан ссылаться обратно на example.ru. Без взаимности разметка игнорируется.
Яндекс учитывает hreflang?
Частично. Яндекс понимает синтаксис hreflang и не ругается на разметку, но приоритет отдаёт собственным сигналам — в первую очередь настройке региона сайта в Яндекс.Вебмастере. Для русско-украинских и русско-казахских пар надёжнее явно указывать регион в Вебмастере параллельно с hreflang. Для русско-английских пар и международных рынков hreflang работает и в Яндексе.
Можно ли использовать hreflang для региональных версий одного языка?
Да, и это один из основных сценариев. Сайт интернет-магазина с тремя версиями (ru-RU, ru-UA, ru-KZ) — контент на русском, но цены, валюта и условия доставки разные. Google распределит трафик по регионам автоматически. Без разметки все три версии будут конкурировать в выдаче как дубли.