PMを編集して下書きを保存しようとした際にMini profilerが403エラーを引き起こす

v2026.8.0-latest +28v2026.7系から)へのアップデート以降、「開発者」としてPM(プライベートメッセージ)を編集する際に、以下のような現象が発生しています。

{52B46C2B-8166-4B02-92C9-936558B256BA}

ブラウザのコンソールには以下が表示されます:

20:54:29.425 includes.js?v=e0bcc9ce0ae3bb5d6b736b6f282f601f:840  POST https://dietpi.com/forum/drafts.json 403 (Forbidden)
(anonymous) @ includes.js?v=e0bcc9ce0ae3bb5d6b736b6f282f601f:840
send @ jquery.js:9940
ajax @ jquery.js:9521
i @ ajax.js:233
Z @ ajax.js:252
save @ draft.js:37
saveDraft @ composer.js:1535
_saveDraft @ composer.js:1963
_shouldSaveDraft @ composer.js:1999
sendEvent @ cache-DtDz7X5V.js:471
(anonymous) @ cache-DtDz7X5V.js:665
invoke @ index.js:262
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_ensureInstance @ index.js:919
ensureInstance @ index.js:731
scheduleRevalidate @ index-DaCZcoCY.js:4146
dirtyTag @ index.js:229
dirtyTagFor @ index.js:848
setter @ index.js:871
set @ cache-DtDz7X5V.js:1886
_setProp @ property_set-n9lAuzYY.js:47
set @ property_set-n9lAuzYY.js:42
(anonymous) @ set_properties-D2_u0phU.js:94
changeProperties @ cache-DtDz7X5V.js:802
(anonymous) @ set_properties-D2_u0phU.js:88
setProperties @ observable.js:30
_hydrate @ store.js:446
_hydrateFindResults @ store.js:106
(anonymous) @ store.js:124
Promise.then
find @ store.js:123
(anonymous) @ composer.js:1110
mu @ rsvp-ziM3qQyS.js:412
(anonymous) @ rsvp-ziM3qQyS.js:468
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
end @ index.js:565
_runExpiredTimers @ index.js:869
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_reinstallTimerTimeout @ index.js:896
_later @ index.js:829
later @ index.js:652
next @ index.js:562
_triggerAction @ d-button.gts:212
click @ d-button.gts:166
20:54:31.380 includes.js?v=e0bcc9ce0ae3bb5d6b736b6f282f601f:840  POST https://dietpi.com/forum/drafts.json 403 (Forbidden)
(anonymous) @ includes.js?v=e0bcc9ce0ae3bb5d6b736b6f282f601f:840
send @ jquery.js:9940
ajax @ jquery.js:9521
i @ ajax.js:233
Z @ ajax.js:252
save @ draft.js:37
saveDraft @ composer.js:1535
_saveDraft @ composer.js:1963
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
end @ index.js:565
_runExpiredTimers @ index.js:869
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_scheduleExpiredTimers @ index.js:892
_runExpiredTimers @ index.js:868
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_scheduleExpiredTimers @ index.js:892
_runExpiredTimers @ index.js:868
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_scheduleExpiredTimers @ index.js:892
_runExpiredTimers @ index.js:868
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_scheduleExpiredTimers @ index.js:892
_runExpiredTimers @ index.js:868
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_reinstallTimerTimeout @ index.js:896
_later @ index.js:829
debounce @ index.js:680
debounce @ index.js:713
(anonymous) @ debounce.js:26
debouncedRecalculateHeaderOffset @ glimmer-site-header.gjs:96
_run @ index.js:804
_join @ index.js:783
join @ index.js:605
join @ index.js:152
(anonymous) @ index.js:250
20:54:34.397 7:1 リソース https://dietpi.com/matomo/matomo.js は link preload を使用してプリロードされましたが、ウインドウの読み込みイベントから数秒以内に使用されませんでした。適切な `as` 値が設定されており、意図的にプリロードされていることを確認してください。
20:54:39.457 7:1 リソース https://dietpi.com/matomo/matomo.js は link preload を使用してプリロードされましたが、ウインドウの読み込みイベントから数秒以内に使用されませんでした。適切な `as` 値が設定されており、意図的にプリロードされていることを確認してください。

この403エラーは、おそらくミニプロファイラ(MiniProfiler)から発生しているようです:

    if (!window.MiniProfiler || !window.MiniProfiler.patchesApplied) {
      var send = XMLHttpRequest.prototype.send;

      XMLHttpRequest.prototype.send = function(data) {
        ajaxStartTime = new Date();
        this.addEventListener("load", function() {
          // responseURL isn't available in IE11
          if (
            this.responseURL &&
            this.responseURL.indexOf(window.location.origin) !== 0
          ) {
            return;
          }
          if (this.__miniProfilerSkipResultsFetch) {
            return;
          }
          // getAllResponseHeaders isn't available in Edge.
          var allHeaders = this.getAllResponseHeaders
            ? this.getAllResponseHeaders()
            : null;
          if (
            allHeaders &&
            allHeaders.toLowerCase().indexOf("x-miniprofiler-ids") === -1
          ) {
            return;
          }
          // should be a string of comma-separated ids
          var stringIds = this.getResponseHeader("X-MiniProfiler-Ids");

          if (stringIds) {
            var ids = stringIds.split(",");
            fetchResults(ids);
          }
        });
        send.call(this, data);
      }; // fetch results after ASP Ajax calls

私の理解では、drafts.jsonへのPOST送信時に403エラーを受けるのは send.call(this, data) の部分です。おそらく data が無効なデータ(ガベージ)であるため、403エラーが発生しているのでしょうか? ブラウザにはCSP(Content Security Policy)やその他のセキュリティルール/ヘッダーによるリクエストのブロックに関する情報はありません。

この問題は、公開投稿の編集や、会話への新しいPMの追加時には発生せず、PM会話内の投稿を編集する時のみ発生します。

ALT+Pでプロファイラを非表示にしても、このエラーは防げません。開発者ではないユーザーとしてテストする必要があるかもしれません。

このエラーの結果として、データが有効なJSONではないため、編集の保存も失敗していると思われます。

私たちは公式Dockerコンテナを使用していますが、ご覧の通り、/forum サブパスの背後でプロキシ(Apache2)を介して実行しています。これが影響を与えている可能性があります。

あー、Cloudflareのファイアウォールの誤検知(False Positive)でした。「Cloudflare Managed Ruleset」の 95a84ab1645a49c685648c17761e7a4c です。もし他に同じ問題に遭遇した人がいたら参考になれば幸いです。これはDiscourseのためにデフォルトのルールセットから無効化しなければならなかった7つ目のルールです。このルールはJSONコンテンツ、つまり投稿の本文を特定のパターンでスキャンするため、シェル(およびその他の)コードを頻繁に書いたり貼り付けたりすると、これらのルールがトリガーされてしまいます。