Hreflang — атрибут, который сообщает поисковым системам о языковых и региональных версиях страницы. Без hreflang Google может показывать пользователю из Испании русскоязычную версию или индексировать дубли вместо правильных вариантов. В этом руководстве разберём синтаксис, методы реализации и типичные ошибки настройки hreflang.
Зачем нужен hreflang
Мультиязычные и мультирегиональные сайты сталкиваются с проблемами:
- Дублирование контента — одна и та же страница на разных языках может восприниматься как дубль
- Неправильная выдача — пользователь из Германии получает английскую версию
- Размывание ссылочного веса — несколько URL конкурируют за один запрос
Hreflang решает эти проблемы, явно указывая поисковикам связь между версиями и предпочтительный вариант для каждого языка/региона.
Синтаксис hreflang
Формат кода
Код состоит из кода языка (ISO 639-1) и опционально кода региона (ISO 3166-1 Alpha 2):
| Код | Значение |
|---|---|
| ru | Русский |
| en | Английский |
| en-GB | Английский (Великобритания) |
| en-US | Английский (США) |
| de | Немецкий |
| es | Испанский |
| x-default | Версия по умолчанию (когда нет подходящей локали) |
Три способа указания hreflang
1. В HTML (link в head):
<head>
<link rel="alternate" hreflang="ru" href="https://example.com/ru/page" />
<link rel="alternate" hreflang="en" href="https://example.com/en/page" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/page" />
</head>
2. В HTTP-заголовках:
Link: <https://example.com/ru/page>; rel="alternate"; hreflang="ru",
<https://example.com/en/page>; rel="alternate"; hreflang="en",
<https://example.com/en/page>; rel="alternate"; hreflang="x-default"
3. В sitemap XML:
<url>
<loc>https://example.com/ru/page</loc>
<xhtml:link rel="alternate" hreflang="ru" href="https://example.com/ru/page"/>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/page"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/page"/>
</url>
Достаточно одного метода. Рекомендуется HTML — самый простой для проверки и отладки.
Правила реализации
1. Взаимная ссылка
Каждая версия должна ссылать на все остальные, включая саму себя:
<!-- На странице /ru/page -->
<link rel="alternate" hreflang="ru" href="https://example.com/ru/page" />
<link rel="alternate" hreflang="en" href="https://example.com/en/page" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/page" />
<!-- На странице /en/page — те же три ссылки -->
Отсутствие самоссылки или ссылки на другую версию — частая ошибка.
2. Абсолютные URL
Google рекомендует абсолютные URL. Относительные могут работать, но абсолютные надёжнее:
<!-- Рекомендуется -->
<link rel="alternate" hreflang="en" href="https://example.com/en/page" />
<!-- Допустимо, но не рекомендуется -->
<link rel="alternate" hreflang="en" href="/en/page" />
3. x-default
x-default указывает версию по умолчанию — когда язык/регион пользователя не совпадает ни с одним вариантом. Обычно это английская или международная версия:
<link rel="alternate" hreflang="x-default" href="https://example.com/en/page" />
4. Один набор на страницу
Все hreflang-ссылки для одной страницы должны быть в одном месте. Нельзя разбивать на несколько блоков.
Структуры URL для мультиязычных сайтов
Поддомены
ru.example.com
en.example.com
de.example.com
Подкаталоги
example.com/ru/
example.com/en/
example.com/de/
Домены по странам
example.ru
example.de
example.co.uk
Google не отдаёт предпочтения структуре. Важно консистентность и корректный hreflang.
Пример полной разметки
Страница на русском с версиями на английском и немецком:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Услуги — Пример</title>
<link rel="alternate" hreflang="ru" href="https://example.com/ru/services" />
<link rel="alternate" hreflang="en" href="https://example.com/en/services" />
<link rel="alternate" hreflang="de" href="https://example.com/de/services" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/services" />
</head>
<body>
<!-- Контент -->
</body>
</html>
На каждой из трёх страниц (ru, en, de) должен быть идентичный набор из четырёх link-тегов.
Динамическая генерация hreflang
Для CMS и фреймворков — генерация на основе текущей страницы:
// PHP пример
$currentPath = $_SERVER['REQUEST_URI'];
$languages = ['ru', 'en', 'de'];
foreach ($languages as $lang) {
$url = 'https://example.com/' . $lang . $currentPath;
echo '<link rel="alternate" hreflang="' . $lang . '" href="' . $url . '" />' . "\n";
}
echo '<link rel="alternate" hreflang="x-default" href="https://example.com/en' . $currentPath . '" />';
// Next.js (App Router)
export default function Layout({ params: { lang } }) {
const languages = ['ru', 'en', 'de'];
return (
<html>
<head>
{languages.map((l) => (
<link
key={l}
rel="alternate"
hreflang={l}
href={`https://example.com/${l}/${pathname}`}
/>
))}
<link rel="alternate" hreflang="x-default" href={`https://example.com/en/${pathname}`} />
</head>
<body>{children}</body>
</html>
);
}
Проверка hreflang
Используйте инструмент проверки hreflang на reChecker для аудита разметки. Инструмент выявит:
- Отсутствующие взаимные ссылки
- Неверные коды языков
- Отсутствие x-default
- Несоответствие URL
Для комплексной технической проверки мультиязычного сайта — технический аудит reChecker.
Hreflang и canonical
Hreflang и canonical решают разные задачи:
- Canonical — указывает предпочтительную версию при дублировании контента (одинаковый язык)
- Hreflang — связывает версии на разных языках
На мультиязычной странице canonical обычно указывает на саму себя:
<link rel="canonical" href="https://example.com/ru/page" />
<link rel="alternate" hreflang="ru" href="https://example.com/ru/page" />
<link rel="alternate" hreflang="en" href="https://example.com/en/page" />
Не канонизируйте русскую страницу на английскую или наоборот — это разные версии контента.
Hreflang и sitemap
Sitemap с hreflang
Если используете sitemap для hreflang, каждый URL в наборе должен быть представлен в sitemap. Один блок url содержит loc и все xhtml:link для каждой версии.
Множественные sitemap
При большом количестве страниц — sitemap index. Каждый sitemap в индексе содержит свои URL с hreflang. Структура должна быть консистентной.
Hreflang для частичного контента
Не все страницы существуют на всех языках. Например, блог только на русском, услуги — на русском и английском. В наборе hreflang включайте только реально существующие URL. Не ссылайте на несуществующие версии.
Региональные варианты одного языка
en-US, en-GB, en-AU — разные регионы, один язык. Hreflang различает их. Используйте коды регионов, когда контент адаптирован под регион (валюта, правописание, примеры).
Проверка и валидация
Ручная проверка
Откройте каждую версию страницы, просмотрите HTML. Убедитесь, что link-теги присутствуют и идентичны на всех страницах набора.
Автоматизированная проверка
Инструмент hreflang на reChecker проверяет разметку, выявляет ошибки взаимных ссылок, кодов, x-default. Экономит время при аудите.
Google Search Console
Отчёт «Международная целевая аудитория» показывает проблемы с hreflang, если они влияют на индексацию. Ошибки отображаются с рекомендациями.
Чек-лист настройки hreflang
| Проверка | Статус |
|---|---|
| Все версии ссылают друг на друга | |
| Каждая страница ссылает на саму себя | |
| Указан x-default | |
| Используются абсолютные URL | |
| Коды языков по ISO 639-1 | |
| Коды регионов по ISO 3166-1 (если нужны) | |
| Разметка на каждой странице набора | |
| Нет ссылок на несуществующие версии | |
| Sitemap обновлён (если используется) |
Связанные материалы
Подробнее о продвижении сайтов на разных языках — в руководстве по международному SEO. Типичные ошибки hreflang и их исправление — в статье ошибки hreflang. Проверить разметку можно в инструменте hreflang и техническом аудите на reChecker.