Языковую версию сайта обычно проверяют так: открывают главную, переключают язык, видят переведённый текст и закрывают вкладку. Проверка пройдена. На самом деле она только что не состоялась — потому что всё важное начинается со второго клика.
Первого сентября 2026 мы разбирали собственный сайт после вопроса, который звучал просто: почему с русской страницы услуги ссылки ведут на украинские адреса. Ответ оказался длиннее вопроса. Причин было пять, лежали они в разных местах кода, и ни одна не была видна на первом экране.
Как это видит читатель
Возьмём русскую страницу услуги. Сверху стандартные хлебные крошки:
Главная → Razrabotka → Internet magaziny → страница
Два дефекта в трёх словах. Во-первых, название собрано из латинского сегмента адреса вместо слова «Разработка» — выглядит как машинный недосмотр, и это именно он. Во-вторых, и это хуже, ссылка ведёт на адрес без языкового префикса. Такой страницы не существует: сервер отдаёт 404.
То есть читатель, дошедший до нужной страницы и решивший подняться уровнем выше — ко всей категории услуг, — попадал в пустоту. На каждой из 237 опубликованных страниц услуг, в двух языковых версиях каждая.
Дальше в теле страницы: блок «читайте также», карточки смежных услуг, кнопка перехода в портфолио, подсвеченные термины в тексте. Мы посчитали на одной странице — 12 ссылок, все 12 вели на украинские адреса. Читатель, пришедший на русскую версию и начавший ходить по сайту, после первого же клика оказывался в украинской и больше из неё не выходил.
Почему этого годами не видно
Здесь работают сразу три вещи.
Ничто не ломается. Ссылка на чужой язык — это рабочая ссылка. Страница открывается, отдаёт 200, выглядит нормально. Мониторинг молчит, ошибок в консоли нет, автотест на битые ссылки проходит.
Разработчик проверяет на основном языке. По-украински всё правильно — именно этот язык и есть основа, из которой строились адреса. Дефект включается только тогда, когда в адресе появляется префикс.
Аналитика показывает норму. Люди ходят по сайту, страницы просматриваются. То, что русскоязычный посетитель за два клика оказался в украинском разделе, в отчётах не отмечается никак — это тот же сайт, те же просмотры.
Пять причин одного симптома
Вот что мы нашли, когда пошли по коду.
Крошки брали сегменты из адреса как есть. На странице /ru/razrabotka/... первый сегмент — razrabotka, и код честно строил из него ссылку /razrabotka. Украинский адрес — /rozrobka, поэтому получалось 404. Та же строка шла в название кнопки: карта переводов ключуется украинскими слагами, razrabotka там не находился, и название собиралось из слага с заглавной буквы.
Дерево услуг переводило адрес, но не добавляло префикс. Здесь было почти правильно: слаг переводился, internet-magaziny вместо internet-magazyny. Не хватало /ru в начале — и ссылка шла на редирект вместо целевой страницы.
Карточки списков брали украинский адрес осознанно. В коде стояло обращение к полю с украинским слагом — не опечатка, а решение, принятое когда-то для одноязычного сайта и пережившее его.
Блок «читайте также» не получал переведённых адресов вообще. Самое коварное из пяти: логика была уже исправлена, но выборка из базы не включала колонку с локализованными слагами. Код запрашивал перевод, получал пустоту и честно откатывался на украинский адрес. После исправления остальных мест именно здесь изменилось лишь пять ссылок из четырнадцати — и это был единственный намёк, что что-то осталось.
Автоматическая подсветка терминов была одноязычной. Механизм, находящий в тексте названия технологий и делающий из них ссылки, хранит украинские адреса целей. На русской странице слово «OpenCart» вело в украинский раздел.
Отдельным пунктом — hreflang. На хабах категорий он объявлял адреса, которые сами отдают редирект. То есть поисковой системе сообщалось: «английская версия этой страницы лежит вот здесь», а по тому адресу стояло перенаправление на другую. Google это переживёт, но сигнал испорчен, и в документации прямо сказано, что указывать нужно конечный адрес.
Что это значит для поиска
Без преувеличений. Это не история о потерянных позициях — о позициях вообще честно говорить нельзя, и никакая цифра здесь не будет доказательной.
Механизм другой и проще. Поисковая система оценивает языковую версию прежде всего по тому, самодостаточна ли она: есть ли у неё собственные внутренние ссылки, можно ли по ней ходить, не вываливаясь в другой язык. Когда каждый выход с русской страницы ведёт в украинскую, робот получает ровно то же, что видит читатель — тупик. Страницы второго языка становятся листьями без веток.
Вторая часть цены — обход. Ссылка на адрес с редиректом тратит запрос робота впустую. Ссылка в 404 — тем более. На сайте из двух-трёх страниц это не имеет значения. На нескольких сотнях это уже заметная доля обхода, потраченная ни на что.
Третья, самая простая: читатель. Человек, выбравший язык и через два клика читающий другой, делает очевидный вывод о сайте.
Как проверить это у себя за полчаса
Метод, который сработал у нас, намеренно примитивен: он смотрит на готовый HTML и ничего не знает о намерениях кода. Именно поэтому он трижды показал нам, что «исправлено» на самом деле означало «почти».
Берёте адрес с языковым префиксом и считаете ссылки, в которых этого префикса нет:
curl -s https://ваш-сайт.com/ru/какая-то-страница \
| grep -o 'href="/[^"]*"' \
| grep -v 'href="/ru' \
| sort -u
В выводе будет три вида адресов.
Первый — то, что там и должно быть: переключатель языков, файлы, внешние ресурсы. Переключатель обязан вести на другие языки, это его работа. Мы на этом споткнулись: первый прогон показал дефекты на всех типах страниц, и половина «дефектов» оказалась переключателем. Отличать его нужно по атрибуту hreflang в том же теге.
Второй — страницы, у которых языковой версии нет вообще. У нас это семь форм-опросников для клиентов. Добавить им префикс означало бы отправить человека в 404, поэтому они остались украинскими осознанно, и это нормальное решение, а не недосмотр.
Третий — собственно дефекты.
Повторите это для каждого типа страницы, а не для каждой страницы: главная, раздел, подраздел, карточка, список, статья, форма. Типов обычно десяток-полтора, и каждый сделан отдельным шаблоном, поэтому дефект в одном ничего не говорит о другом. У нас из тринадцати типов чистыми оказались шесть — но узнали мы это только потому, что проверили все тринадцать.
Отдельно проверьте крошки — это самая дешёвая проверка из всех:
curl -s -o /dev/null -w "%{http_code}\n" https://ваш-сайт.com/адрес-из-крошки
И hreflang — каждый объявленный адрес должен отдавать 200, а не 301 или 308:
curl -s https://ваш-сайт.com/страница | grep -o 'hreflang="[^"]*" href="[^"]*"'
Что получилось
До начала работы: 224 разных адреса, на которые вели ссылки с языковых версий в чужой язык. После: семь, и все семь — те же формы без перевода.
Одиннадцать типов страниц из тринадцати стали полностью чистыми. Крошки отдают 200 вместо 404 и пишутся словами языка страницы. hreflang ведёт на конечные адреса.
Цифры намеренно о работе, а не о результате. Что из этого выйдет в поиске — будет видно через несколько недель в Search Console, и именно туда мы будем смотреть. Обещать рост под такую правку нельзя: она убирает потерю, а не добавляет спроса.
Честные границы
Это не работа, которую стоит начинать, если языковая версия у вас формальная — переведена машинно и никому не нужна. Тогда дешевле её убрать, чем лечить перелинковку.
Это также не даёт ничего одноязычному сайту. И не заменяет перевода: страница, соединённая правильно, но написанная чужим языком, остаётся чужой.
И главное, чего эта проверка не делает: она не объясняет, почему дефект появился. У нас пять причин лежали в пяти разных файлах, написанных в разное время разными руками. Найти их помог не аудит кода, а тупой перебор готового HTML — и именно его мы оставили в проекте как постоянную проверку после каждого изменения в навигации.
Если у вас есть языковые версии и вы никогда не проверяли их со второго клика — начните с команды выше. На неё нужно меньше времени, чем на чтение этой статьи.




