テーマコンポーネントが about.json でアセットを宣言すると、Discourse はそれらを /uploads/ の下に保存して提供します。
サイト設定 「匿名ユーザーによるファイルのダウンロードを防止する」 が有効になっている場合、これらのテーマアセットは、保護されたアップロードとして扱われるため、匿名ユーザーには 404 を返します。
これにより、動的に独自の JavaScript を読み込むテーマやコンポーネント(例:トピックリストプレビュー コンポーネント)が破損する可能性があります。
再現手順
- トピックリストプレビュー コンポーネント(
https://github.com/merefield/discourse-tc-topic-list-previews)をインストールします。 - ログイン済みユーザーと匿名ユーザーの両方で正しく読み込まれることを確認します。
- サイト設定 匿名ユーザーによるファイルのダウンロードを防止する を有効にします。
- ログアウトしたユーザーとしてフォーラムのホームページにアクセスし、ブラウザのコンソールを確認します。
観測された動作
-
以下のようなファイルへのリクエスト
/uploads/default/original/1X/d8ce366bd7aad8f9fc7b26b08aecc855dd6d425c.jsは 404 Not Found(実際にはHTMLエラーページ)を返します。
-
ブラウザコンソールに以下が表示されます:
Refused to execute script ... because its MIME type ('text/html') is not executable -
そのファイルに依存するコンポーネント(例:トピックリストプレビューの
preview-edits.gjs)は実行に失敗し、レイアウトの問題が発生します。
期待される動作
about.json で定義されたテーマアセットは、「匿名ユーザーによるファイルのダウンロードを防止する」設定に関係なく、常に公開アクセス可能であるべきです。
これらはユーザーアップロードではなく静的アセットであり、アップロードレベルのアクセス制限を継承すべきではありません。
技術的な詳細
-
Discourse バージョン:3.6.0.beta2 (最新)
-
コンポーネント:トピックリストプレビュー
-
関連する
about.jsonスニペット:"assets": { "imagesloaded": "assets/imagesloaded.js" } -
テーマインストール中、Discourse はこのファイルを
/uploads/default/original/...の下のUploadとして保存します。 -
匿名制限を有効にすると、Discourse はテーマアセットであるにもかかわらず、そのパスへのリクエストをブロックします。
提案される解決策
about.json 経由でアップロードされたテーマアセットは、以下のようにすべきです:
- 専用のパス(例:
/theme-assets/または/assets/)から提供される
または - 「匿名ユーザーによるファイルのダウンロードを防止する」制限から除外される。
影響
これは、クライアントで動的に読み込まれるテーマアセット(JS/CSS/画像)に依存する、あらゆるテーマやコンポーネントに影響します。
匿名ダウンロード制限がオンの場合、匿名訪問者にとって主要なUIコンポーネントが破損します。