Что именно решает разметка
Hreflang отвечает на один вопрос: у вас есть несколько версий одной страницы, какую из них показать конкретному человеку. Он не переводит содержание, не переключает язык на сайте и не участвует в отборе документов для выдачи.
Разделение важно, потому что от разметки регулярно ждут не того. Ожидание «поставим hreflang, вырастут позиции в другой стране» не сбывается: сначала система должна вообще решить показать ваш сайт по запросу, и это решение принимается по обычным сигналам — содержанию, ссылкам, релевантности формулировке запроса. Только после этого из набора версий выбирается одна.
Второй эффект менее очевиден и более ценен: разметка защищает версии друг от друга. Три страницы с одинаковой структурой и переведённым текстом выглядят похожими, и без явного указания система может счесть их вариантами одного документа. Как система обычно поступает с такими наборами, разобрано в материале о дублирующемся содержании; hreflang снимает часть этих рисков, объясняя, что различие намеренное.
Третья задача — версии на одном языке для разных стран. Здесь текст может совпадать почти дословно, а различаться будут цены, доставка и условия, и без разметки правильная версия попадёт нужному человеку только случайно.
Как выглядит корректный набор
Разметка ставится в блоке head, по одной строке на каждую версию, включая текущую.
<link rel="alternate" hreflang="en" href="https://example.com/en/page/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/seite/" />
<link rel="alternate" hreflang="es-es" href="https://example.com/es/pagina/" />
<link rel="alternate" hreflang="es-mx" href="https://example.com/mx/pagina/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />
Три правила, нарушение любого из которых обесценивает весь набор.
Взаимность. Если английская страница указывает на немецкую, немецкая обязана указывать на английскую. Односторонняя ссылка отбрасывается — система не может проверить, согласны ли обе стороны, а без этого разметкой мог бы управлять кто угодно со стороны.
Самоссылка. Каждая страница перечисляет и саму себя. Без этого набор считается неполным.
Абсолютные адреса. Относительные пути в этой разметке не работают, адрес указывается целиком, с протоколом и доменом, и в том виде, в каком страница реально доступна — с учётом слеша и регистра, о чём говорится в разборе структуры адресов.
Отдельно про canonical. Каждая версия указывает канонический адрес на саму себя. Попытка назначить одну версию канонической для всех — распространённая и разрушительная ошибка: она прямо сообщает, что остальные версии не нужны в индексе, и разметка после этого не имеет значения.
Три места размещения
| Способ | Когда применяют | Слабое место |
|---|---|---|
Блок head в HTML | Обычные страницы, большинство сайтов | Растёт вес страницы при десятках версий |
| Заголовки HTTP | Файлы без HTML — документы, изображения | Требует настройки на стороне сервера |
| XML-карта сайта | Много версий, сложная структура | Ошибки не видны при просмотре страницы |
Смешивать способы для одной страницы не следует: при расхождении между разметкой в коде и в карте сайта поведение непредсказуемо, а искать причину потом трудно.
Вариант с картой сайта удобен на больших проектах: связи описываются в одном файле, и правка не требует релиза шаблонов. Расплата — невидимость: открыв страницу, разметку не увидишь, и ошибка живёт до ближайшего аудита.
Коды, на которых чаще всего ломается
Значение атрибута состоит из кода языка и необязательного кода страны. Языки берутся из одного стандарта, страны — из другого, и путаница между ними даёт большинство ошибок.
en-uk не существует. Код страны для Великобритании — gb, а uk — это код языка (украинский). Запись выглядит логичной и отбрасывается молча.
Только страна без языка недопустима. Значение de-at корректно, at в одиночку — нет.
Регистр не имеет значения, порядок имеет. Сначала язык, потом страна. Перестановка делает значение невалидным.
Код страны — не то же самое, что аудитория. Значение es-mx означает «испанский для конкретной страны», а не «для всех, кто говорит по-испански в Латинской Америке». Если версия одна на регион, точнее указать только язык.
Автоперенаправление по стране ломает всё. Когда сайт принудительно перебрасывает посетителя на версию по его расположению, робот попадает в ту же ловушку и видит не тот набор, который размечен. Механика потерь описана в материале о переадресации; для языковых версий безопаснее предложить выбор, а не навязывать его.
В выдаче человеку показывается версия не на его языке. Первым делом проверяется взаимность: скорее всего, обратной ссылки нет и связь не учтена. Вторая по частоте причина — canonical, указывающий с этой версии на другую. Обе проверяются обходом сайта, например в краулере, а не выборочным просмотром страниц.
Часть языковых версий не попадает в индекс. Разметка тут ни при чём — она не влияет на попадание в индекс. Причина обычно в другом: страницы закрыты, не связаны внутренними ссылками или содержат машинный перевод без правки. Смотреть нужно отчёты об охвате индексирования.
Разметка стояла и работала, после релиза перестала. Классика: шаблон стал выводить набор только для страниц с полным переводом, и на страницах без него самоссылка исчезла. Ошибка не видна в браузере и находится только регулярной проверкой при техническом аудите.
Две страны с одним языком конкурируют между собой в выдаче. Тексты почти идентичны, различий мало, и системе не за что зацепиться. Разметка тут помогает частично; остальное решается реальными различиями в содержании — ценами, условиями, местными деталями. Если различий нет, честнее объединить версии в одну.
Порядок внедрения
- Собрать карту соответствий. Таблица «страница — её версии на всех языках». Это самая трудоёмкая часть, особенно когда переведено не всё: страница без перевода не должна попадать в набор вообще.
- Решить, что делать с непереведённым. Два варианта: не включать в разметку либо не публиковать до перевода. Худший вариант — указывать в наборе адрес, который отдаёт содержание на другом языке.
- Выбрать одно место размещения. Код страниц либо карта сайта, но не оба сразу.
- Проверить взаимность автоматически. Обход краулером с отчётом по hreflang. Ручная проверка на нескольких страницах пропустит именно те типы, где обычно и ломается.
- Настроить отслеживание после релиза. Отчёты панели вебмастера показывают ошибки разметки отдельным блоком; проверять их имеет смысл вместе с остальными данными панели поиска.
Шаг с непереведёнными страницами пропускают чаще всего, а он самый болезненный: набор с адресом, ведущим не на ту языковую версию, работает хуже, чем полное отсутствие разметки.
Границы
Это подсказка, а не команда. Система вправе показать другую версию, если сочтёт её более подходящей. Гарантий разметка не даёт.
Поддержка неодинакова. Не все поисковые системы используют этот атрибут; часть определяет региональную принадлежность собственными настройками в панели вебмастера. Полагаться на одну разметку при работе с несколькими системами не стоит.
Разметка не спасает плохой перевод. Машинный перевод без редактуры остаётся слабым содержанием, и корректные связи между версиями этого не меняют.
Не решает вопрос выбора структуры. Подкаталоги, поддомены или отдельные домены — решение принимается до разметки и по другим основаниям: юридическим, техническим, организационным.
Не помогает при частичном переводе. Сайт, где переведена десятая часть страниц, разметкой не спасается: набор получается рваным, и большинство страниц остаётся вне его. Здесь сначала решают, какой объём переводится целиком, и только потом связывают.
Не заменяет локализацию. Переведённый текст при неизменных примерах, единицах измерения и способах оплаты остаётся чужим для читателя, и на поведение это влияет сильнее любой технической детали. Тот же разрыв виден и в сниппете, когда описание переведено дословно.
Спорное место
Hreflang — редкий случай разметки, где цена ошибки выше пользы от правильного внедрения. Работающий набор даёт умеренный эффект: часть пользователей чаще попадает на нужную версию. Сломанный набор способен убрать версии из выдачи, склеить их между собой или отправить посетителей не туда — и обнаруживается это через недели.
Отсюда неудобный вывод для небольших проектов: две языковые версии с разной структурой и неполным переводом иногда безопаснее вообще не связывать разметкой, а развести содержанием и адресами так, чтобы они не пересекались по запросам. Совет звучит еретически, но он честнее, чем рекомендация внедрить hreflang там, где никто не будет поддерживать его при каждом релизе.
Второе сомнение — про распределение усилий. Работа с языковыми версиями почти всегда начинается с технической части, потому что она конечна и понятна. Реальная же причина, по которой версия не получает трафик, обычно лежит в содержании: перевод сделан с исходного текста, написанного под другой рынок, и отвечает на вопросы, которых там не задают. Никакая разметка это не компенсирует.
Частые вопросы
Влияет ли hreflang на позиции?
Нужен ли hreflang, если версии на разных доменах?
Что писать в x-default?
Можно ли указывать только язык, без страны?
Как проверить, что разметка работает?