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 でアクセスしても正常に動作します。
こちら が当初この問題を修正したコミットですが、getURL は Discourse.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)を招くかどうかはわかりません。ご助言いただければ幸いです。