サブフォルダ設定でクライアントサイドのパス書き換えが失敗する

Discourse による URL パス書き換えの動作がサブフォルダにより失敗する の議論の続きです:

上記のトピックで報告されているのと全く同じ問題が発生しています。具体的には、サブルートの開始部分がサブフォルダと一致する場合にのみ URL が書き換えられてしまいます。私はサブフォルダに /f を使用していますが、この設定のリスクや課題は理解しています。しかし、それ以外は正常に動作しているため、可能であればこの問題の修正についてサポートをいただきたいです。

既存の Discourse ルートは使用していませんが、1 文字のサブフォルダが問題であれば、別の設定を検討する前に修正を試みたいと考えています。

書き換えられてしまういくつかのルート例:

  • /f/t/food-chain-magnate/4826/f/tood-chain-magnate/4826
  • /f/tag/food-chain-magnate/f/tagood-chain-magnate
  • /f/u/renato/follow/following/f/u/renatoollow/following
  • /f/u/fred/summary/f/ured/summary

これはクライアントサイドでの書き換えであるため、同じ URL を CURL でアクセスしても正常に動作します。

こちら が当初この問題を修正したコミットですが、getURLDiscourse.BaseUri の代わりに get-url ヘルパーを使用するように変更されています。

その getURL への呼び出しを追跡すると、最初の呼び出しでは location.pathname は正しい(/f で始まる)ですが、次の呼び出しのいずれかでサブフォルダが剥がされ、/t/f-started-slug/id のような形になり、この replace がその /f に対して動作してしまいます。

Discourse の内部構造については十分に理解していないため、この書き換えがどこで行われているのか完全には把握できていませんが、私の環境でテストしたところ、withoutPrefix 内の replace 処理を path の先頭でのみ動作するように強制すると、問題が解決するようです。

// 以下を変更
return path.replace(rootURL, "");
// 以下のように変更(rootURL のエスケープが不要と仮定)
return path.replace(new RegExp("^" + rootURL), "")
// または正規表現を使わずに
return path.indexOf(rootURL) === 0 ? path.slice(rootURL.length) : path;

これが有効な修正になるかどうか、あるいは回帰(regression)を招くかどうかはわかりません。ご助言いただければ幸いです。

「いいね!」 1

まあ、既存のトピックをより詳しく検索すれば、昨日の返信にこの問題を解決するヒントが見つかったかもしれません…
https://meta.discourse.org/t/two-bugs-with-usernames-starting-with-subfolder-name/169505/6

編集: すぐに 70050a8ba3 にアップグレードしましたが、問題は解決しませんでした。

「いいね!」 2

時間が許す限り、こちらを確認いたします。

「いいね!」 4

確かにその通りですね。調査とバグ報告ありがとうございます。この PR で修正されるはずです:

https://github.com/discourse/discourse/pull/12135

@renato さん、試していただけますか?

「いいね!」 2

もう問題なく動いています。ありがとうございます!

「いいね!」 2

このトピックは7日後に自動的に閉鎖されました。新しい返信は許可されていません。