Дубли возникают, когда одна языковая версия доступна по нескольким адресам: /ru/page, /page?lang=ru, cookie-вариант и URL с лишним слешем. Поисковая система получает противоречивые canonical, hreflang и редиректы и не понимает, какую страницу показывать.
Выберите одну стабильную схему URL для каждого языка и перенаправьте альтернативы. Каждая индексируемая локаль обычно ставит canonical на себя, а hreflang связывает эквивалентные страницы взаимно. Автоматический редирект по IP не должен блокировать выбор пользователя и обход робота.
Что проверить в первую очередь
Сначала зафиксируйте наблюдаемое поведение и не меняйте сразу несколько настроек. Важны точное время сбоя, адрес или сценарий, ожидаемый результат и последнее известное рабочее состояние. Так можно отличить причину от случайного совпадения и сохранить возможность быстрого отката.
- Соберите все URL одной страницы для каждого языка, включая параметры, слеши, регистр и домены.
- Сравните HTML lang, canonical, hreflang и HTTP-коды без cookies и с ними.
- Проверьте sitemap и внутренние ссылки: они должны использовать только каноническую схему.
- Убедитесь, что перевод действительно соответствует языку, а не дублирует исходный текст.
Почему возникает проблема
У подобных сбоев редко бывает одна универсальная причина. На итог одновременно влияют конфигурация приложения, окружение, данные, кеш, права и внешние сервисы. Проверка должна идти от внешнего симптома к конкретному уровню, на котором впервые появляется неверное состояние.
- Язык хранится только в cookie, а URL остается одинаковым с разным содержимым.
- Параметр lang и языковой префикс работают одновременно.
- Canonical всех локалей указывает на основную, обнуляя смысл hreflang.
- Hreflang не взаимный, содержит несуществующий код или ведет через редирект.
- Middleware перенаправляет робота по IP/Accept-Language на одну версию.
Пошаговая диагностика
Диагностику проводите на копии или в контролируемое время. Перед изменениями сохраните конфигурацию, данные и журналы. Каждый шаг должен отвечать на один вопрос и оставлять измеримый результат: код ответа, запись в логе, состояние процесса, значение поля или воспроизводимый тест.
- Сделайте crawl без cookies и выгрузите status, canonical, lang и hreflang для всех локалей.
- Проверьте каждую пару alternate: обе страницы должны ссылаться друг на друга.
- Сравните URL в меню, sitemap, pagination, карточках и Open Graph.
- Проверьте 404/redirect для отсутствующего перевода и поведение x-default.
- Найдите параметры и варианты регистра, которые отдают 200 с тем же содержимым.
Рабочая схема URL и hreflang
Подкаталоги, поддомены и отдельные домены могут работать. Критична последовательность: один URL на локаль и одинаковые правила для всех шаблонов.
- Например, /ru/... и /en/... должны иметь стабильные соответствующие маршруты.
- Каждая индексируемая локаль получает self-canonical, если это полноценная отдельная версия.
- Hreflang использует корректные языковые/региональные коды и абсолютные конечные URL.
- x-default ведет на нейтральный выбор языка или основную страницу по принятой стратегии.
- Если перевода нет, не создавайте пустой дубль; выберите осознанный 404, отсутствие alternate или понятный fallback.
Как исправить проблему
Исправление лучше разбить на небольшие обратимые изменения. После каждого шага повторяйте исходный сценарий и проверяйте соседние функции. Если правка касается данных, сначала выполните ее на ограниченной выборке и сохраните журнал затронутых записей.
- Закрепите одну схему и настройте 301 со старых параметров и дублей без цепочек.
- Сформируйте canonical и hreflang из одной карты локализованных маршрутов.
- Обновите меню, sitemap, хлебные крошки и внутренние ссылки.
- Разрешите пользователю сменить язык и запомните выбор без постоянного принудительного редиректа.
- Публикуйте локаль только при наличии качественного уникального перевода и метаданных.
Безопасный порядок внедрения
- Сохраните резервную копию затрагиваемых файлов, базы и конфигурации, а также заранее опишите способ отката.
- Воспроизведите сбой на тестовой записи, учетной записи или отдельном окружении без реальных платежей и рассылок.
- Вносите по одному логическому изменению, фиксируя его в системе контроля версий или журнале работ.
- Не отключайте права, проверку входных данных и защитные механизмы только ради исчезновения сообщения об ошибке.
- После выкладки контролируйте логи, метрики и ключевой пользовательский сценарий, а не только открытие одной страницы.
Как проверить результат
Успешный разовый тест еще не доказывает исправление. Нужны повторный запуск, крайние случаи и проверка после очистки кеша, перезапуска процесса или новой сессии. Для критичных сценариев полезно сохранить автоматический тест или хотя бы короткий регрессионный чек-лист.
- Каждый контент доступен по одному индексируемому URL на язык.
- Canonical self, hreflang взаимны и ведут на страницы с HTTP 200.
- Sitemap содержит только канонические URL и согласован с HTML-разметкой.
- Бот без cookies может открыть любую локаль напрямую без принудительного цикла.
Типичные ошибки при исправлении
- Ставить canonical всех языков на русскую страницу.
- Использовать hreflang ru-RU для языка там, где нужен просто ru, без принятой региональной стратегии.
- Редиректить каждый запрос по IP и не давать открыть выбранный язык.
- Создавать тысячи машинных дублей с одинаковым title и непереведенным содержимым.
Как предотвратить повторение
Профилактика строится вокруг наблюдаемости и воспроизводимости: понятных конфигураций, контролируемых релизов, журналов без секретов и тестов на реальные сценарии. Важно не просто убрать текущий симптом, а сделать следующий похожий сбой заметным раньше пользователя.
- Храните карту локализованных slug как структурированные данные.
- Добавьте автоматическую проверку взаимности hreflang и статусов URL.
- Проверяйте новый шаблон crawl-отчетом до публикации.
- Следите за отчетами поисковых систем о дублях и альтернативных canonical.
Что подготовить для разбора
- Краткое описание ожидаемого и фактического поведения без паролей, токенов и персональных данных.
- Точное время и последовательность действий, после которых появляется проблема.
- Версии приложения, окружения и зависимостей, а также перечень последних изменений.
- Фрагменты журналов с контекстом до и после ошибки; секреты в них необходимо скрыть.
- Описание уже выполненных проверок и способ безопасно повторить проблему.
Частые вопросы
Нужно ли canonical с английской страницы ставить на русскую?
Обычно нет, если английская версия самостоятельна и должна индексироваться. Она ставит canonical на себя и связывается с русской через hreflang.
Что делать, если перевод страницы отсутствует?
Не создавайте пустой индексируемый дубль. Уберите hreflang на несуществующую версию и используйте согласованный 404 или понятный fallback без подмены URL.
Когда нужна помощь специалиста
Если языковые версии конкурируют в поиске или создают дубли, я могу собрать карту URL, исправить canonical/hreflang/редиректы и sitemap и проверить весь набор локалей автоматическим обходом.