Взаимность и есть весь механизм
Hreflang работает через перекрёстное подтверждение. Страница A заявляет, что страница B — её русская версия; страница B обязана заявить, что A — её английская. Если одной стороны нет, робот не может проверить связь и отбрасывает разметку для этой пары.
Именно поэтому hreflang так часто не работает при том, что он есть: теги добавили на основной язык и не добавили в переводы.
Четыре ошибки, которые стоит проверять
- Нет ссылки на себя. Каждая страница должна перечислять и себя.
- Относительные адреса. Игнорируются молча. Только абсолютные, со схемой.
- Неверный код.
RUв верхнем регистре,en_GBчерез подчёркивание,uaдля украинского (правильноuk). Всё игнорируется. - Нет x-default. Не фатально, но оставляет выбор роботу для каждого посетителя, под чей язык у вас страницы нет.
Куда это ставить
В <head>, в HTTP-заголовки или в sitemap — все три способа корректны, и нужен
только один. Head проще всего проверять и труднее всего забыть, поэтому
инструмент выдаёт теги link.
Для двуязычного сайта блок занимает три строки и не меняется. Положите его в layout, чтобы он не разъехался с реальностью.
Вопросы
Почему каждая страница должна указывать саму себя?+
Потому что hreflang — набор взаимных объявлений, и робот их проверяет. Если английская страница указывает на русскую, а русская обратно не указывает, вся разметка отбрасывается — не частично применяется, а отбрасывается. Ссылка на себя входит в этот взаимный набор.
Зачем нужен x-default?+
Это страница для тех, чьего языка у вас нет. Туда попадёт говорящий по-португальски, если вы предлагаете английский и русский. Без него поисковик решает сам и обычно выбирает страницу, которую обошёл первой, а не ту, которую выбрали бы вы.
Указывать язык или язык с регионом?+
Только язык, если региональные версии действительно различаются — цены, юридический текст, наличие товара. `en-GB` и `en-US` на сайте с одной английской версией стравливают ваши же страницы между собой без всякой пользы.
Адреса обязаны быть абсолютными?+
Да. Относительный href в hreflang игнорируется целиком, и это одна из самых частых причин, по которой корректный в остальном блок не работает. Инструмент это подсвечивает.