URLに日本語を含むトピックは、URLが完全に一致しない場合、リダイレクトされない

community.wanikani.com において、完全修飾 URL に日本語を含むトピックへのリンクを、新しいタブで開いたり、直接リンクをコピーして貼り付けたりすると、開けなくなりました。同じタブ内でリンクをクリックして移動する場合は問題なく動作します。

例えば、このリンク を新しいタブで開くと、以下に移動するはずです。

キノの旅 Home Thread (Intermediate Book Club) - Book Clubs - WaniKani Community

しかし実際には、以下に移動しようとして失敗します。

キノの旅 Home Thread (Intermediate Book Club) - Book Clubs - WaniKani Community

このため、ページが読み込めません。

もしリンク が完全に一致している場合は問題なく動作します。ただし、トピックのタイトル変更が行われている場合、これはよく起こりません。

また、try.discourse.org 上で再現を試みましたが、このインストール版では、トピックタイトルに日本語が含まれていても、URL に日本語文字が追加されることはありません。その理由については不明ですが、そのような挙動がないため、そこでバグを再現することはできませんでした。

「いいね!」 2

どちらもトピック 34890 へのリンクです。私では Firefox で正常に読み込まれます。問題は何でしょうか?

「いいね!」 3

ため息 またもや Chrome のバグかもしれませんね。私にとっては Firefox と Edge の両方で問題なく動作します。奇妙なことに、シークレットウィンドウでは最初は正常に動作するのですが、2 回目は失敗してしまいます。サイトのキャッシュやクッキーを削除してコンピュータを再起動しても同じ現象が起きます。

Chrome によると、エラーは「リダイレクトが多すぎます」とのことです。


もしよろしければ、Chrome で確認していただき、これが私だけの問題ではなく、全般的な問題なのかどうかお調べいただけますでしょうか?最初のアクセスは正常に動作するようですので、ページを複数回開いて試してみてください。お手伝いいただき、ありがとうございます!

「いいね!」 3

Chrome モバイルで再現できます。:bug:

「いいね!」 5

ありがとうございます。Google に報告します。

「いいね!」 1

Android の Chrome で 2 つ目のリンクにアクセスすると、無限にリダイレクトしてしまいます。

「いいね!」 1

まだ Chrome でお困りでしょうか?彼らに報告する前に確認したくて質問しました。Discourse 側で最近、これに関連する変更があったとは考えられますか?(いずれにせよ、Discourse 側に変更があったとしても、この現象が Chrome でのみ発生する以上、おそらく Chrome 側の問題だと思われます。)

「いいね!」 3

少し待ってください。これは Discourse の問題かもしれません。Service Worker のバグの可能性もあります。

「いいね!」 5

わかりました、更新ありがとうございます。

「いいね!」 1

これについて更新はありますか?

整理するには時間がかかりますが、すでに担当者が割り当てられているため、見落としはございません。

「いいね!」 7

解決策や回避策が見つかることは期待していません。修正されるのを待つしかありません。

この問題はまだ発生していますか?もしかしたら修正済みかもしれません。あるいは、今回は何か異なることをしているのでしょうか。

「いいね!」 1

いや、訂正します。今日また発生し始めました。なぜか一時的に直っていた理由もわかりません。


解決に時間がかかる可能性があるため、当面の回避策でも構いません。元のスレッドで触れた通り、Try(メタでも確認しました)では日本語文字が URL に追加されないため、この問題が実質的に回避されています。これはサイト設定やカテゴリ設定で、サイト管理者と相談して変更できるものなのでしょうか?それ以外に回避策のご提案はありますか?

アラビア語のタイトルを持つ URL をブラウザに入力すると、例えば:

https://forums.coretabs.net/t/2456

無限のリダイレクトが発生してしまいます(生成されたリンクが正しくないようです。これはエンコーディングに関連していると思われます)。

本来は以下のようにリダイレクトされるはずです:

https://forums.coretabs.net/t/ماذا-يجب-ان-نتعلم-في-javascript-؟/2456

なぜタイトル付きのリンクを共有しないのか?

Twitter や Facebook のアラビア語サポートが不十分だからです:

  • このバグは最新のアップデート以前には存在しませんでした(最後にリンクを共有しようとしたのは約 2 週間前で、その時は完全に問題ありませんでした)。
「いいね!」 3

コードベースを調査したところ、エラーの原因は比較的単純なようですが、私の仮定を確認させてください。

slug_generation_method というサイト設定があり、このバグをトリガーするには、デフォルトの ascii 値から encoded に変更する必要があります。このサイト設定を変更すると、すべてのスラッグがクリアされ、再生成されます。

理解できていないのは、サイト設定が “encoded” に設定されている場合に、なぜ以下のようなスラッグが生成されるのかということです。

[3] pry(main)> SiteSetting.slug_generation_method
=> "encoded"
[4] pry(main)> Slug.for(t.slug)
=> "キノの旅-home-thread-intermediate-book-club"

私は “encoded” とは以下のようなものを意味すると考えていました。

[5] pry(main)> CGI.escape(Slug.for(t.slug))
=> "%E3%82%AD%E3%83%8E%E3%81%AE%E6%97%85-home-thread-intermediate-book-club"

これはおそらく以下のプルリクエストに由来しているようです。

テーブルからの生のスラッグは、トピックのスラッグが一致しない場合に 301 応答の Location ヘッダーで返されますが、そこには有効な URL を返すべきだと私は考えます。

「いいね!」 9

はい、エンコード用のスラッグ生成メソッドを整理して、ブラウザの魔法に依存しないようにすべきですね。

「いいね!」 8

つまり、URL 自体がエンコードされたバージョンを表示するということですか?それとも、リダイレクトが内部でエンコードされたバージョンを使用して処理するだけですか?どちらにせよ、ブラウザの挙動に依存せず、この問題を「自動的に解決」できるのが理想的です。

「いいね!」 1

こんにちは、

この件は解決しましたか?
まだこの問題に直面しています。以前、この件について 私が作成したトピック で投稿した通りです。

「いいね!」 1

いいえ、bug カテゴリで開かれたトピックが示す通りです :sweat_smile:

@sam 今日改めて確認しましたが、対応方法として 2 つの選択肢があります:

  1. スラッグ生成設定が encoded に設定されている場合、スラッグカラムに実際の エンコード済み スラッグを格納する。現在のエンコード済みスラッグをすべてクリアするマイグレーションを実行し、時間経過とともに適切に再生成されるようにする。

  2. 現在の UTF-8 スラッグを維持し、301 リダイレクトのヘッダー送信時にその場でパッチを適用する。

個人的には 1 の方が「より正しい」アプローチであり、生のスラッグをクライアントに渡すことを難しくします。ただし、スラッグ生成メソッドのパッチだけでは不十分でした。ブラウザは 301 リダイレクトでエンコードされた URL を受け取りますが、次のリクエストではそれをデコードするため、スラッグ比較が失敗して再度リダイレクトされてしまいます。つまり、トピックコントローラーのスラッグ比較メソッド、そして他の場所でもパッチを適用する必要があります。

この方向で進めてもよろしいでしょうか?

「いいね!」 6