Hreflang: как связать языковые версии сайта и проверить ошибки
У сайта есть русский, английский и немецкий разделы, но в поиске появляется неудобная для посетителя версия. Иногда проблема связана с разметкой, иногда — с содержанием или недоступным переводом. Настройка hreflang начинается с проверки того, какие страницы действительно соответствуют друг другу. Добавление одинакового блока во все шаблоны без такой карты способно связать разные товары и разделы.
Ниже разберём рабочую схему: выбрать локали, составить набор эквивалентных страниц, опубликовать аннотации и проверить результат после изменения переводов. Все адреса на example.com вымышленные. Пример показывает проектное решение, а не обещает определённую позицию или обязательный выбор страницы поисковой системой.
1. Сначала составьте карту эквивалентных страниц
Группа hreflang относится к конкретному содержанию: одному товару, услуге, руководству или другому материалу. Русская карточка насоса и немецкая категория насосов решают разные задачи, даже если названия похожи. Для связи нужен общий смысл страницы и понятный ответ на вопрос: получит ли человек после смены языка нужный ему материал?
Начните с небольшой выборки: главная, одна услуга, категория, карточка и статья. Для каждой записи сохраните внутренний идентификатор материала, язык, регион, окончательный URL, состояние публикации и ответственного редактора. Идентификатор полезнее совпадения адресных окончаний: переводчик может изменить название и адрес, сохранив тот же материал.
Отдельно отметьте частичные переводы. Если переведены только меню и кнопки, не записывайте в акте приёмки «немецкий текст проверен». Google определяет язык по видимому содержимому, а не по hreflang или атрибуту lang; это разъясняется в рекомендациях для многоязычных сайтов. Проверяющий должен прочитать основной блок, условия и важные сообщения.
Такая карта помогает и владельцу бизнеса: сразу видно, где обещана полноценная локализация, где осталась редакционная задача, а где версия вообще не предусмотрена. Не нужно создавать фиктивные страницы только ради заполнения всех столбцов.
Не стройте соответствия одним заменяемым префиксом адреса. Удаление /ru/ и добавление /de/ ещё не доказывает существования перевода. Пусть генератор получает подтверждённую связь материалов из CMS, а не угадывает её по похожему URL. Особенно внимательно проверяйте импортированные карточки и адреса, которые редактор менял вручную.
2. Укажите язык, затем при необходимости регион
В документации Google по hreflang базовый формат — язык ISO 639-1 и необязательный регион ISO 3166-1 Alpha 2. Страна без языка не подходит. Для Великобритании используйте GB: UK не задаёт поддерживаемый региональный таргетинг.
| Значение | Смысл в нашей карте | Что проверить редактору |
|---|---|---|
ru | Русский язык без ограничения страной | Русский основной текст |
en | Английский без регионального уточнения | Общие условия, подходящие заявленной аудитории |
en-GB | Английский для Великобритании | Нужные местные условия и обозначения |
de | Немецкий без ограничения страной | Переведённое содержание материала |
Регистр кода Google не считает различием, но единый стиль en-GB упрощает проверку. Есть поддерживаемые уточнения письменности по ISO 15924: например, zh-Hans, zh-Hant и сочетание zh-Hans-US. Это не основание переносить в hreflang любой внутренний код CMS; в частности, Google не поддерживает es-419 как региональный вариант.
Заведите отдельный справочник соответствий между настройкой CMS и опубликованной локалью. Если внутри проекта используется en_GB, генератор должен выдать согласованный формат с дефисом. Новую локаль добавляют после проверки аудитории и контента, а не автоматически при появлении очередного пункта в административной панели.
3. Выберите один поддерживаемый способ публикации
Google одинаково поддерживает три способа: HTML-ссылки в head, HTTP-заголовок Link и аннотации в XML sitemap. Достаточно одного способа; одновременное использование трёх не усиливает результат. Выбор удобнее делать по тому, где команда надёжнее управляет картой переводов.
| Способ | Когда рассмотреть | Что включить в приёмку |
|---|---|---|
HTML link | Шаблон страницы получает список переводов из CMS | Фактический HTML каждой версии |
HTTP Link | Аннотации нужны в ответе сервера, в том числе для PDF | Заголовки ответа на GET-запрос |
| XML sitemap | Карту удобнее генерировать централизованно | Файл, записи URL и альтернативы |
Для XML обычного списка адресов недостаточно: понадобятся аннотации xhtml:link и пространство имён XHTML. Общие требования к файлу, абсолютным адресам и кодировке приведены в руководстве по созданию sitemap. При выбранном HTML-способе отдельную hreflang-разметку в sitemap добавлять необязательно.
Если разметка уже существует в нескольких местах, сначала сравните их. Старый sitemap может противоречить новому шаблону, а сервер — продолжать добавлять прежние заголовки. Назначьте один источник данных и ответственного за выпуск. Сокращение числа независимых настроек упрощает последующие изменения.
4. Соберите пример из четырёх локалей
Предположим, опубликовано руководство по эксплуатации модели Pump A. Есть русская и немецкая версии, общий английский текст и отдельная британская редакция с местными условиями обслуживания. Последняя в этом примере содержательно адаптирована; решение о её canonical принято отдельно. Английский общий адрес одновременно выбран резервным.
| Локаль | Окончательный адрес | Роль |
|---|---|---|
ru | https://example.com/ru/pump-a/ | Русский материал |
en | https://example.com/en/pump-a/ | Общий английский материал |
en-GB | https://example.com/en-gb/pump-a/ | Британская редакция |
de | https://example.com/de/pump-a/ | Немецкий перевод |
В корректный head каждой из четырёх страниц наш генератор помещает одинаковый набор, включая ссылку на текущую версию. Адреса абсолютные; реальные альтернативы могут находиться и на разных доменах.
<link rel="alternate" hreflang="ru" href="https://example.com/ru/pump-a/">
<link rel="alternate" hreflang="en" href="https://example.com/en/pump-a/">
<link rel="alternate" hreflang="en-GB" href="https://example.com/en-gb/pump-a/">
<link rel="alternate" hreflang="de" href="https://example.com/de/pump-a/">
<link rel="alternate" hreflang="x-default" href="https://example.com/en/pump-a/">
Получились четыре уникальных URL и пять аннотаций на страницу: дополнительная роль x-default не создаёт пятую страницу. Общий английский адрес обслуживает аудиторию без нужной региональной редакции. Для другого руководства набор может отличаться — нельзя копировать эти адреса в шаблон всех материалов.
5. Проверьте собственные ссылки и взаимность
Для полной схемы из примера проверяем каждую страницу против одной матрицы: русский URL видит все четыре локали и резервный адрес; английский, британский и немецкий — тот же набор. Самоссылка здесь означает присутствие текущей страницы среди альтернатив, а не отдельный canonical.
| Проверяемая страница | Ссылка ru | Ссылка en | Ссылка en-GB | Ссылка de |
|---|---|---|---|---|
| ru | На себя | Есть | Есть | Есть |
| en | Есть | На себя | Есть | Есть |
| en-GB | Есть | Есть | На себя | Есть |
| de | Есть | Есть | Есть | На себя |
В каждой ячейке «Есть» проверяют точный адрес из предыдущей таблицы. Зеркальные ячейки показывают взаимность, диагональ — ссылки на текущие версии. Резервный x-default проверяется дополнительно на каждой странице. Эту матрицу удобно приложить к задаче до разработки: тогда исполнитель и принимающий специалист сверяются с одинаковым ожидаемым результатом.
Обратная связь проверяется попарно. Если русский материал указывает на немецкий, откройте немецкий ответ и найдите ссылку именно на этот русский материал. Похожий адрес соседней модели не подходит. Не ограничивайтесь наличием слова hreflang в исходнике: проверяйте пару «код — URL».
Google отдельно поясняет в ответе об отсутствующих обратных аннотациях, что неработающая связь не отменяет остальные корректные связи. Это не автоматическая поломка всего кластера или всех страниц сайта. Однако частично рабочий набор не заменяет исправление обнаруженной ошибки.
В журнале проверки полезна конкретная запись: «На немецком руководстве отсутствует обратная ru-ссылка; остальные пары проверены». Она позволяет исправить генерацию или данные нужного материала. Запись «hreflang сломан везде» без перечня страниц обычно отправляет разработчика на повторную диагностику.
6. Выберите осмысленный резервный адрес x-default
Google описывает x-default как резервную версию для аудитории, которой не соответствует другой указанный вариант. Это специальное значение, а не код языка. Его можно использовать для выбора языка или подходящего материала по умолчанию; добавление необязательно для каждой группы.
В нашем примере резервом служит общее английское руководство. Другой допустимый проектный вариант — страница выбора языка именно этого руководства. Пользователь должен сохранить контекст: он искал инструкцию к Pump A, поэтому полезнее предложить её доступные переводы, чем отправить человека заново искать товар.
Разметка сама не выполняет HTTP-редирект и не переключает интерфейс браузера. Если сайт перенаправляет посетителя, это отдельная логика приложения, которую проверяют отдельно. Не объясняйте внезапную смену языка одним наличием x-default.
Укажите резерв в карте материала и проверьте его открытие. Если выбранный адрес исчезнет, понадобится пересмотреть эту роль во всей группе. Не стоит оставлять формально заполненное поле, которое ведёт на ошибку или на страницу с совершенно другим назначением.
7. Согласуйте hreflang с canonical
Hreflang связывает локализованные варианты, а canonical выражает предпочтение среди дублирующих или очень похожих URL. По рекомендациям Google по canonical, при использовании hreflang предпочтительный адрес выбирают на том же языке, если такой вариант существует. Эти отношения не следует объединять в один тег.
У самостоятельных полноценных переводов обычное решение — собственный canonical каждой страницы. Нельзя автоматически канонизировать русский, немецкий и английский материалы на русский только потому, что он был создан первым. Такое правило смешивает происхождение перевода с выбором поискового представителя.
Для русской страницы нашего примера отдельная строка выглядит так:
<link rel="canonical" href="https://example.com/ru/pump-a/">
На остальных страницах canonical проверяют отдельно; этот русский адрес не копируют вместе с общим hreflang-блоком. Для региональных дублей на одном языке действует важная оговорка: Google рекомендует выбрать предпочтительную версию и использовать canonical совместно с hreflang. Поэтому требование «всегда только self-canonical» также неверно.
Сравните содержимое английских региональных страниц, их назначение и действующую стратегию дублей. Зафиксируйте решение в карте, затем проверьте фактический canonical. Наличие отличающейся валюты само по себе не доказывает, что все вопросы дублирования уже решены.
8. Убедитесь, что указанные версии доступны
Для каждой альтернативы запишите исходный адрес, цепочку перенаправлений, конечный URL и полученное содержание. Ответ 200 недостаточен, если вместо руководства показаны форма входа, сообщение об отсутствии материала или общая главная. Проверяющий должен подтвердить нужную страницу и ожидаемый язык.
Проверьте версию без сохранённой сессии и выбранного ранее языка. Не должна возникать ситуация, когда посетитель открывает немецкий адрес, а приложение неизменно отправляет его в русский раздел. Google рекомендует отдельные URL и предостерегает от автоматических языковых перенаправлений, мешающих доступу к версиям. Настройки IP или языка браузера не заменяют такую структуру.
Достаточно точечной проверки препятствий обходу и индексированию: нет ли закрытого раздела, непреднамеренного noindex или блокировки нужного пути. Здесь не требуется заново переписывать все правила сайта. При сомнении сопоставьте ожидаемый публичный статус страницы с тем, что реально получает поисковый инструмент.
В самой карте используйте согласованный окончательный адрес. Если страница переехала, исправьте источник ссылок, а не полагайтесь бесконечно на старую цепочку. При разных доменах назначьте ответственных с обеих сторон: односторонняя правка шаблона не подтверждает доступность и ответные аннотации другого сайта.
9. Обновите группу, когда перевод отсутствует или удалён
Предположим, немецкое руководство из учебного примера окончательно снято с публикации. Сначала уточните причину: редакционное удаление, перенос или временная техническая ошибка требуют разных действий. Краткий сбой сервера не повод немедленно перестраивать карту языков всего сайта.
Если перевода больше нет и замены не предусмотрено, из набора этого материала убирают de. Остаются ru, en, en-GB и x-default на английский URL. Три действующие страницы должны получить обновлённую карту. Нельзя исправить только русскую версию, оставив устаревшие ссылки в английском шаблоне или кеше.
| Проверка | До удаления | После согласованного изменения |
|---|---|---|
| Действующие страницы материала | Четыре | Три |
| Аннотации на каждой действующей странице | Пять | Четыре |
| Немецкая альтернатива | Адрес перевода | Отсутствует в наборе |
| Резервный адрес | Общий английский | Сохранён и проверен |
Судьбу старого немецкого URL решают отдельно: существует ли равнозначная замена, нужно ли сохранить материал, как сообщить об удалении. Не подставляйте под de главную страницу и не создавайте несуществующий адрес ради полного списка. В переключателе языка можно честно обозначить отсутствие перевода и предложить доступный текст.
Если материал позднее вернулся, редактор сначала подтверждает публикацию и содержание, затем команда возвращает локаль во все действующие версии. Это отдельное изменение с собственной проверкой, а не автоматическая реакция на появление записи в базе.
Область исправления тоже важна. Удаление немецкой инструкции Pump A не требует убрать немецкий из инструкций других моделей, где перевод сохранён. Проверьте, что операция затронула нужную группу. Иначе локальное редакционное решение может превратиться в массовую потерю корректных связей из-за общей настройки шаблона.
10. Найдите ошибки hreflang по опубликованной матрице
Проверяйте опубликованный результат, а не только настройку плагина. Для HTML сохраните исходный ответ и убедитесь, что элементы расположены в корректном head. Если разметку меняет JavaScript, сравните исходник с итоговым документом. Для HTTP-способа изучайте заголовки, для sitemap — фактический доступный файл.
- Возьмите одну строку карты и откройте каждый указанный URL.
- Сравните материал, язык, конечный адрес и условия доступа.
- Извлеките пары «hreflang — href» и сопоставьте с утверждённым набором.
- Проверьте собственную ссылку и обратные связи между вариантами.
- Сопоставьте canonical с решением для этой страницы.
- Повторите проверку после обновления кеша и публикации соседних версий.
Для большой выборки сохраняйте результат в таблицу: страница, ожидаемый набор, фактическое отличие, время проверки и задача на исправление. Полезно отдельно проверить материал без одного перевода, региональную редакцию и недавно изменённый URL. Одна успешная главная страница не проверяет генератор карточек.
При автоматизации сравнивайте наборы пар, а не порядок строк. Лишняя устаревшая ссылка столь же важна, как отсутствующая. Сохранённый ответ помогает воспроизвести ошибку, если во время повторной проверки другой сервер уже отдаёт новую версию.
11. Отделите исправление разметки от результата в поиске
После выпуска подтвердите доступность и содержимое через инструмент проверки URL в Search Console. Данные индексированной версии и проверка текущего URL отвечают на разные вопросы. Выбранный Google canonical смотрят в данных индекса; живая проверка не предсказывает этот выбор.
Не считайте зелёный результат проверкой всех отношений hreflang. Для связей остаётся собственная матрица и сопоставление ответов. Если Google выбрал другой canonical, сначала разберите конкретный адрес и сигналы, а не меняйте сразу все языковые группы.
Отметьте дату выпуска и последнего известного обхода. Сохраните примеры запросов, локаль проверки и показанный URL, чтобы не сравнивать разные условия. Один поиск с личного устройства не доказывает одинакового поведения для всех пользователей.
Корректная настройка не гарантирует немедленного появления нужной версии, роста позиций или обязательного индексирования. Задача приёмки — подтвердить технически согласованные страницы и аннотации; оценка поискового результата требует отдельного наблюдения после обработки изменений.
12. Закрепите проверку в работе с переводами
Назначьте владельца карты локалей и добавьте проверку в публикацию, перенос и удаление материалов. Редактор отвечает за соответствие содержания, разработчик — за генерацию, принимающий специалист — за фактические ответы. Если один человек совмещает роли, полезно сохранить эти три отдельных вопроса в задаче.
Перед завершением подтвердите: нужные переводы существуют, коды согласованы, набор опубликован на всех участниках, резервный адрес выбран осмысленно, canonical проверен, устаревшие ссылки удалены. Сохраните результат для конкретных URL и предусмотрите повторную проверку после следующего изменения шаблона.
Для новой локали заранее определите последовательность выпуска. Сначала готовят и проверяют страницу, затем включают её в согласованный набор и проверяют все ответные связи. Если выпуск прерван, задача должна явно показывать, какие участники уже обновлены. При возврате прежнего релиза повторно сверяют карту: старый шаблон не должен ссылаться на удалённые после него материалы.
Подключите SiteGuard для внешнего контроля HTTP-доступности страниц. Корректность hreflang и соответствие переводов проверьте отдельно.