「匿名ユーザーによるファイルのダウンロードを防止する」を有効にすると、「/uploads/」から提供されるテーマアセットが壊れる

テーマコンポーネントが about.json でアセットを宣言すると、Discourse はそれらを /uploads/ の下に保存して提供します。
サイト設定 「匿名ユーザーによるファイルのダウンロードを防止する」 が有効になっている場合、これらのテーマアセットは、保護されたアップロードとして扱われるため、匿名ユーザーには 404 を返します。
これにより、動的に独自の JavaScript を読み込むテーマやコンポーネント(例:トピックリストプレビュー コンポーネント)が破損する可能性があります。


再現手順

  1. トピックリストプレビュー コンポーネント(https://github.com/merefield/discourse-tc-topic-list-previews)をインストールします。
  2. ログイン済みユーザーと匿名ユーザーの両方で正しく読み込まれることを確認します。
  3. サイト設定 匿名ユーザーによるファイルのダウンロードを防止する を有効にします。
  4. ログアウトしたユーザーとしてフォーラムのホームページにアクセスし、ブラウザのコンソールを確認します。

観測された動作

  • 以下のようなファイルへのリクエスト

    /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コンポーネントが破損します。

「いいね!」 3

詳細な説明をありがとうございます。ここで行うべきことがあるというのはもっともだと思います。

「いいね!」 1

テーマアセットに限定されないと思います。この設定を有効にすると、匿名ユーザーのサイトロゴやファビコンなども壊れるようです。実装は、匿名ユーザーの /uploads/* への完全なブロックです。

@lhkjacky あなたのサイトでも匿名ユーザーのロゴが壊れていますか?

「いいね!」 1