Ошибки hreflang, которые ломают международное SEO
Почти все сломанные настройки hreflang объясняются десятью ошибками, и большинство из них не подаёт признаков. Разбираем, как заметить и исправить каждую.
Большинство проблем с hreflang сводится к десяти ошибкам: нет обратных ссылок, нет ссылки на саму себя, неверные коды языка или региона, относительные URL, указание на неканонические страницы, отсутствующий x-default, смешение способов внедрения, частичное покрытие, заблокированные альтернативные версии и попытка лечить с помощью hreflang дублирующийся контент. У каждой — понятный симптом и конкретное исправление.
Что hreflang делает на самом деле
hreflang сообщает поисковым системам, какую языковую или региональную версию страницы показать конкретному пользователю. Он подменяет URL в результатах — и больше ничего. Это не буст ранжирования. Страница с безупречной разметкой всё равно должна заслужить свою позицию сама.
Как выглядит корректный набор hreflang
Три версии — английская, испанская и запасная — записанные как элементы link в head каждой из этих страниц:
<link rel="alternate" hreflang="en" href="https://example.com/page/">
<link rel="alternate" hreflang="es" href="https://example.com/es/pagina/">
<link rel="alternate" hreflang="x-default" href="https://example.com/page/">
То же отношение, выраженное в XML-карте сайта, где urlset обязан объявить пространство имён xhtml:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://example.com/page/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/page/"/>
<xhtml:link rel="alternate" hreflang="es" href="https://example.com/es/pagina/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/page/"/>
</url>
</urlset>
Испанская страница несёт точно такой же набор. Эта симметрия и есть весь механизм, а большинство ошибок ниже — способы её нарушить.
1. Нет обратных ссылок
Любое отношение hreflang двунаправленно. Если A указывает на B, то B обязана указывать в ответ на A, иначе аннотация считается неподтверждённой и игнорируется. Симптом: версии никогда не подменяются в выдаче, а Search Console сообщает об отсутствии обратных тегов. Исправление: генерируйте один и тот же полный набор для каждой страницы группы, а не односторонний список.
2. Нет ссылки на саму себя
Каждая страница обязана содержать запись hreflang для собственного URL. Без неё набор неполон, а системы отбрасывают наборы, которые не сходятся. Исправление: добавьте самоссылку — тогда группа из трёх языков несёт три записи на всех трёх страницах.
3. Неверные коды языка и региона
Значение языка должно быть кодом ISO 639-1, а необязательный регион — кодом ISO 3166-1 Alpha 2. Регион никогда не может стоять сам по себе. Три классические ошибки: en-UK вместо en-GB; путаница между zh-CN (китайский в Китае) и zh-Hans (это субтег письменности, а не региона); изобретение языка из названия страны — например, uk для Британии, тогда как это украинский. Некорректные значения отбрасываются без предупреждения.
4. Относительные URL
Значения hreflang должны быть полными абсолютными URL, включая протокол. Значение вида /es/pagina/ недопустимо, и запись пропускается. Симптом: аннотации, которые выглядят правильно в вашем шаблоне, но нигде не регистрируются. Исправление: всегда выводите https://example.com/es/pagina/ — то же правило действует для значений loc в карте сайта.
5. Ссылки на неканонические, редиректящие или закрытые noindex URL
hreflang и canonical обязаны не противоречить друг другу. Canonical каждой страницы указывает на неё саму, а каждое значение hreflang — на канонический URL другой версии. Аннотация URL, который редиректит, канонизируется на другой адрес или закрыт noindex, отправляет противоречивые инструкции, и конфликт обычно разрешается отбрасыванием ваших аннотаций. Исправление: убедитесь, что каждый URL в группе отдаёт 200, индексируется и канонизируется сам на себя.
6. Отсутствующий или неправильно использованный x-default
x-default отмечает запасной вариант для пользователей, чей язык вы не покрываете: страницу выбора языка, глобальную посадочную страницу или вашу основную версию. Симптом: посетители из непокрытых локалей попадают на произвольную версию. Исправление: назначьте один настоящий запасной вариант и повторите его по всей группе.
7. Смешение способов внедрения
Есть три допустимых места для hreflang: элементы link в HTML-head, HTTP-заголовки Link и аннотации xhtml:link в XML-карте сайта. Работает любой из них. Проблемы начинаются, когда сайт наполовину реализует два: в head перечислены два языка, а в карте сайта — четыре. Выберите один способ и доведите его до полноты.
8. Разметка только главной страницы
hreflang — сигнал уровня страницы, а не настройка уровня сайта. Разметка главной ничего не даёт 500 карточкам товаров под ней. Симптом: для каждого рынка верная главная, а страницы глубже — не на том языке. Исправление: сопоставьте каждой странице её настоящие эквиваленты, а там, где эквивалента нет, лучше не указывать этот язык вовсе, чем ссылаться на приблизительное соответствие.
9. Блокировка альтернативной версии, из-за которой её нельзя обойти
Отношение подтверждается, только если обе страницы доступны для загрузки. Запрет языковой папки в robots.txt или гео-редиректы, отбрасывающие краулеров, ломают проверку обратной ссылки. Исправление: держите каждый аннотированный URL доступным для обхода и достижимым без редиректа.
10. Ожидание, что hreflang решит проблему дублей
hreflang управляет региональными и языковыми вариантами. Он не устраняет почти одинаковые страницы и не заменяет теги canonical. Две почти идентичные английские страницы — одна для США, другая для Австралии — по-прежнему конкурируют друг с другом; hreflang лишь говорит, для какого рынка предназначена каждая. Настоящим дублям нужна канонизация или объединение.
Какой способ внедрения выбрать
| Способ | Когда подходит | Главный минус |
|---|---|---|
| Элементы link в head | HTML-страницы, немного языков, сайты на шаблонах | Разметка растёт как квадрат числа языков и грузится при каждом открытии страницы |
| HTTP-заголовок Link | Файлы не в HTML, например PDF, где нет head, который можно править | Не виден в исходном коде, требует настройки сервера или CDN, легко потерять при переезде |
| xhtml:link в XML-карте сайта | Большие сайты и много языков; оставляет разметку страниц лёгкой | Сложнее проверить выборочно, а карта сайта обязана оставаться валидной и актуальной, иначе устаревает весь набор |
Вариант с картой сайта масштабируется лучше всех — и по той же причине отказывает тихо: испорченное пространство имён или устаревший файл уносят аннотации с собой. Проверяйте карту сайта после любого изменения генератора, а большие многоязычные наборы разбивайте через индекс карт сайта.
Как убедиться, что hreflang работает
Проверяйте в обе стороны. Запросите страницу A, прочитайте её набор аннотаций, затем запросите каждый названный в нём URL и убедитесь, что все перечисляют тот же набор, включая себя. Исходный код покрывает HTML-способ, заголовки ответа — второй, карта сайта — третий. Любая асимметрия и есть ошибка.
Там, где Search Console предлагает для вашего ресурса отчёт по международному таргетингу, он перечисляет ошибки hreflang — отсутствующие обратные теги, неизвестные коды языка, — и это самый быстрый способ увидеть проблемы в масштабе. Отчёт отстаёт от ваших выкладок, поэтому относитесь к нему как ко второму мнению. О нижележащих сбоях на уровне обхода — редиректах, 404 и блокировках в robots.txt, которые кладут наборы аннотаций, — читайте руководство по ошибкам карты сайта.