Canonical-тег не сбрасывается после client-side редиректа с ?page=N на /t/slug/id/<post_number>

Мы наблюдаем, что большое количество URL-адресов пермалинков тем и пагинации попадает в категорию «Получено — пока не проиндексировано» в Google Search Console (около 35 000 URL на импортированном форуме возрастом около 20 лет, версия Discourse v2026.9.0-latest, self-hosted).

Что мы выяснили:

Discourse предоставляет ссылки на пагинацию ?page=N для краулеров для длинных тем (поскольку реальный интерфейс использует бесконечную прокрутку). Когда клиент с поддержкой JavaScript (включая рендерер Googlebot) загружает один из таких URL ?page=N, Discourse выполняет клиентский редирект на /t/slug//<post_number>.

Воспроизведение:

  1. Запросите URL темы «холодно», с любым суффиксом номера поста или ?page=:
    GET /t///14 →
    GET /t// → тот же канонический URL
    GET /t///1 → тот же канонический URL
    GET /t//?page=127 → (само-ссылающийся, НЕ нормализованный)
  2. Откройте сайт в обычном режиме (JS включен) и перейдите через роутер Ember на URL, содержащий суффикс номера поста (например, нажав на ссылку «перейти к первому непрочитанному посту» в разделе «Рекомендуемые темы»). После завершения перехода SPA, document.querySelector(‘link[rel=canonical]’).href равен текущему URL с номером поста — он не указывает на базовую тему.

Это противоречит собственному заявленному намерению дизайна Discourse. В этом треде 2015 года @sam был предельно ясен:

▎ Темы: канонический URL должен указывать на базовый топ, чтобы отдельные страницы постов не появлялись как отдельные результаты поиска.
▎ Страницы категорий/списков: канонический URL полностью удален, так как списки с пагинацией не являются дубликатами согласно собственным рекомендациям Google.

То, что мы видим сегодня, нарушает это в двух отношениях:

  1. Тема с ?page=N (пагинация краулера) содержит само-ссылающийся URL с пагинацией в сыром HTML сервера, а не базовый URL темы — хотя темы (в отличие от списков категорий) явно должны были всегда сводиться к базовому URL.
  2. После клиентского редиректа с ?page=N на /t/slug/id/<post_number>, канонический URL в отрендеренном DOM также остается на URL с номером поста, а не сбрасывается на базовую тему.

Оба случая выглядят как регрессии относительно цели дизайна 2015 года, а не как намеренное текущее поведение.

Почему это важно для индексации: Google использует отрендеренный DOM для сигнала канонического URL. Любой URL с суффиксом номера поста/страницы, к которому Google попадает напрямую — через функцию «ссылка на пост» (активно используемую на нашем форуме через WhatsApp/Discord), через старые внешние бэклинки (мы маппим легаси-пермалинки vBulletin ?p= на URL с номером поста) или через собственный краулер, — объявляет свой собственный канонический URL, вместо того чтобы консолидироваться в базовую тему. В Search Console это проявляется как тысячи почти дублирующихся URL, застрявших в статусе «получено — не проиндексировано».

Примеры затронутых URL из нашего отчета GSC (все последние краулинги в начале сентября 2026):
/t/tengo-que-pasar-la-itv/21100/10
/t/new-honda-nsx-proyect/4910/69
/t/hacer-tubo-recto-sin-silencioso-del-catalizador-hacia-atras/25579/25
/t/kedada-japo-en-cataluna-2014/28148/75
/t/el-diario-de-patricio-de-la-plana/13286?p

Вопрос команде: учитывая, что прошло более 10 лет, что-то изменилось с тех пор, и само-ссылающийся канонический URL на этих URL теперь является намеренным? Или стоит пересмотреть это как регрессию? Готовы предоставить файлы HAR / дополнительные примеры воспроизведения, если это поможет.

1 лайк