Один из наших клиентов обнаружил следующую проблему, связанную с SEO, которую я могу воспроизвести здесь на meta.
Когда Discourse посещается поисковым роботом, он добавляет ссылки для пагинации ?page=XX следующим образом:
<link rel="next" href="/t/slug/123?page=2">
и
<span itemprop='name'><b><a rel="next" itemprop="url" href="/t/slug/123?page=2">next page â</a></b></span>
Когда такая страница загружается в браузере, Discourse выполняет JavaScript-редирект на URL вида /t/slug/123/NN, где NN — номер поста.
Таким образом, https://meta.discourse.org/t/post-rate-limit-trigger-for-a-topic-thats-heating-up/98294?page=2 перенаправляет на https://meta.discourse.org/t/post-rate-limit-trigger-for-a-topic-thats-heating-up/98294/23
а https://meta.discourse.org/t/post-rate-limit-trigger-for-a-topic-thats-heating-up/98294?page=3 перенаправляет на https://meta.discourse.org/t/post-rate-limit-trigger-for-a-topic-thats-heating-up/98294/45
Однако иногда на такой странице содержится канонический URL, который не соответствует исходной запрашиваемой странице.
В приведённом выше примере ?page=3 перенаправляет на пост 45, а страница поста 45 содержит канонический URL ?page=2:
<link rel="canonical" href="https://meta.discourse.org/t/post-rate-limit-trigger-for-a-topic-thats-heating-up/98294?page=2" />
Цитируя отчёт клиента по SEO:
Это создаёт цепочку канонических тегов и редиректов, и Google начинает не доверять установленным каноническим тегам.
Мне не удаётся понять, откуда это берётся. Иногда канонический URL указывает на страницу с более высоким номером, иногда — на страницу с меньшим номером (как в этом примере), а иногда он верный.
Я думал, что это может быть связано с удалёнными постами или «шёпотами», но тема с большим количеством удалённых постов не демонстрирует такого поведения (например, https://meta.discourse.org/t/topic-list-previews/101646?page=5 ведёт к посту 471 (!), у которого канонический URL верный: ?page=5). Думаю, это может быть ошибка off-by-one.