投稿にファイル名にアンダースコアが含まれる画像が含まれている場合(例:)、投稿を保存するたびに、生コンテンツ内のアンダースコア前のバックスラッシュが倍増します。
- 1 回目の編集後:![20260421_140231|…]
- 2 回目の編集後:![20260421\_140231|…]
- N 回目の編集後:![20260421{2^N}_140231|…]
17 回の編集後、生フィールドには 131,072 個のバックスラッシュ文字(2^17)が蓄積され、約 8KB から約 136KB に膨れ上がります。これにより、最終的に投稿が編集不可能になります。表示されているコンテンツは小さいにもかかわらず、コンポーザーは max_post_length を大幅に超える文字数を報告します。
再現手順:
- ファイル名にアンダースコアが含まれる画像をアップロードします。
- 投稿に挿入します。Discourse は 20260421_140231 のような代替テキストを生成します。
- 投稿を繰り返し編集して保存します(5〜10 回で増加に気づくことができます)。
- /posts/{id}.json を介して生コンテンツを確認します。保存するたびにバックスラッシュの数が倍になります。
期待される動作:生コンテンツは編集を通じて安定しているはずです。画像の代替テキスト内のアンダースコアは、保存のたびに再エスケープされてはいけません。
実際の動作:保存のたびに、画像の代替テキスト内の _ 前のバックスラッシュが 2 倍になります。
回避策:以下のコマンドを Rails コンソールで実行して、余分なバックスラッシュを削除し、再構築してください。
p = Post.find(POST_ID)
p.update_column(:raw, p.raw.gsub(/\+(?=_)/, “”))
p.rebake!
環境情報:
- Discourse バージョン:2026.4.0-latest
- 公式の ./launcher Docker 環境経由でインストール済み