Один URL на язык, hreflang со взаимными ссылками, canonical на себя, sr-Latn для сербского и 404 вместо тихой подмены английским — правила, по которым работают наши английские, сербские и русские страницы.
Наш сайт говорит на английском, сербском и русском. Для людей это переключатель языка в шапке, для поисковиков — набор правил, который решает, какая версия кому показывается. Ошибётесь — и русская страница начнёт конкурировать с английской, а человек, ищущий на сербском, попадёт на страницу, которую не может прочитать. Рассказываем, как мы это настроили.
Один язык — один адрес
У каждого языка свой URL: английский в корне, сербский под /sr/, русский под /ru/. Содержимое страницы никогда не зависит от cookie или языка браузера, поэтому робот, перешедший по ссылке, видит ту же версию, что и посетитель.
hreflang говорит поисковикам, какая страница для кого
Каждая страница перечисляет все свои языковые версии — включая саму себя — и x-default для всех остальных. Так выглядит head русской версии этой статьи:
<link rel="canonical" href="https://onlyapps.org/ru/blog/hreflang-three-languages" />
<link rel="alternate" hreflang="en" href="https://onlyapps.org/blog/hreflang-three-languages" />
<link rel="alternate" hreflang="sr-Latn" href="https://onlyapps.org/sr/blog/hreflang-three-languages" />
<link rel="alternate" hreflang="ru" href="https://onlyapps.org/ru/blog/hreflang-three-languages" />
<link rel="alternate" hreflang="x-default" href="https://onlyapps.org/blog/hreflang-three-languages" />Важны несколько деталей:
- Взаимные ссылки. Каждая версия должна ссылаться на каждую другую. Если русская страница указывает английскую, а обратной ссылки нет, поисковик может проигнорировать пару.
- Canonical на себя. Каждая языковая версия каноническая сама для себя. Если направить все canonical на английскую, поисковики решат, что переводы — дубли.
- Языковые теги. Значения следуют BCP 47. Сербский пишется двумя алфавитами, поэтому мы помечаем нашу версию как
sr-Latn— сербский латиницей. - x-default. Английская версия — запасная для языков, которые мы не поддерживаем.
Нет перевода — 404, а не подмена
Если пост есть только на английском, /ru/blog/... отвечает 404, а не показывает тихо английский текст под русским адресом. Так каждый проиндексированный URL честен: язык в адресе совпадает с языком страницы. В набор hreflang попадают только реально существующие переводы, а переключатель языка ведёт на нужный перевод — или на главную страницу на этом языке, если перевода нет.
Карты сайта повторяют то же самое
Наши sitemap перечисляют каждую опубликованную страницу на каждом языке и добавляют к каждому URL те же альтернативы. Поисковики узнают связи, не загружая каждую страницу, а даты в lastmod меняются только при изменении контента.
| Проверка | Как выглядит правильно |
|---|---|
| Структура URL | Один URL на язык, без переключения через cookie |
| hreflang | Все версии перечислены на каждой версии, плюс x-default |
| Canonical | Каждая версия каноническая сама для себя |
| Нет перевода | 404 на этом языке, а не копия английской страницы |
| Sitemap | Те же альтернативы, что и в head страницы |
Ошибки, которые встречаются чаще всего
- Переведён интерфейс, а основной текст оставлен на английском под локализованным URL.
- Редирект посетителей по IP, из-за которого роботы не видят остальные версии.
- Путаница региона и языка:
ru-RUограничивает страницу Россией, аruнацелен на русскоязычных по всему миру. - Забытые альтернативы после удаления перевода.
Совет
После любых изменений откройте исходный код страницы на каждом языке и проверьте, что набор hreflang одинаков на всех версиях, — кроме canonical, который всегда указывает на саму страницу.
Хотите увидеть вживую? Переключите язык вверху страницы — попадёте на перевод этой статьи.