クライアントの一人が、ここで再現可能な以下のSEO関連の問題を発見しました。
Discourseがクローラーによってアクセスされると、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">次のページ</a></b></span>
そのようなページがブラウザで読み込まれると、Discourseは /t/slug/123/NN(NNは投稿番号)というURLへのJavaScriptリダイレクトを発行します。
したがって、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(canonical 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には、場合によってはページ番号が大きい値、低い値(この例のように)、あるいは正しい値が含まれることがあります。
削除された投稿や囁き(whispers)に関連しているのではないかと考えましたが、多くの削除された投稿を含むトピックでは、この動作は必ずしも見られません(例:https://meta.discourse.org/t/topic-list-previews/101646?page=5 は投稿471(!)にリダイレクトされますが、この投稿には正しい正規化URL ?page=5 が含まれています)。これはオフ・バイ・ワンエラー(off-by-one error)ではないかと考えています。