js添付ファイルのダウンロードに失敗しました

この質問 と全く同じエラーが発生しています。設定で許可すれば JS ファイルをアップロードできるのですが、ダウンロードしようとするとブラウザの URL が JS ファイルの URL に変わり、「変更が拒否されました」と表示されます。

環境:-
Nginx の背後で動作する Discourse Docker(Nginx は SSL を使用)

Discourse コンテナのログ:-

    Started GET "p5ePkm5OoKveknnMjyArlS4PPwS.js" for 192.168.32.1 at 2021-02-22 05:48:52 +0000
    Processing by UploadsController#show_short as JS
      Parameters: {"base62"=>"p5ePkm5OoKveknnMjyArlS4PPwS", "extension"=>"js"}
    Sent file afcdf626f9db8d54a1fb5e8ebcab0ea214d9226a.js (2.2ms)
    Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.
    Completed 422 Unprocessable Entity in 59ms (ActiveRecord: 0.0ms | Allocations: 17414)
    ActionController::InvalidCrossOriginRequest (Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.)
    /opt/bitnami/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.3.1/lib/action_controller/metal/request_forgery_protection.rb:266:in `verify_same_origin_request'

Nginx のログ:-

    10.164.0.103 - - [22/Feb/2021:05:51:11 +0000] "GET /uploads/short-url/p5ePkm5OoKveknnMjyArlS4PPwS.js HTTP/2.0" 422 781 "getting-started-with-sftp-module/292" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36"

ご協力やヒントをいただければ幸いです!

「いいね!」 2

ユーザーが投稿に *.js ファイルを添付することを許可していますか?また、ユーザーによる JavaScript ファイルの添付に正当な必要性はありますか?今後先に進む前に、完全に確認させていただきたく存じます。

「いいね!」 1

迅速なご返信ありがとうございます!
はい、これはコーディングに関する Q&A の議論ですので、*.js コードファイルを添付することは正当なユースケースです。

「いいね!」 2

みなさんこんにちは!私も同じ問題に直面しています。.js 拡張子のアップロードは許可しているのですが、誰もダウンロードできません。これを解決するための設定はまだ見つかっていません。どなたかお手伝いできませんか?

「いいね!」 1

ユースケースについて説明していただけますか?なぜこれが必要なのでしょうか?

こんにちは、Jeff さん。

現在、投稿のテキストセクションにコードをコピー&ペーストしています。
ユースケース:Kickstarter のコードや反復して発生する問題の解決策を含む .js ファイルを持ち、ユーザーがダウンロードしてプロジェクトで使えるようにアタッチメントとして共有したいというものです。

しかし、ファイル拡張子を .js から .txt に変更すると、再び「変更が拒否されました」と表示されます(これはバックエンドのストレージ最適化によるもので、ファイルの内容が以前アップロードされたものと同一の場合、新しいアタッチメントが以前のファイルへの参照となるためかもしれません)。
そのため、.txt 拡張子の JS ファイルの内容を少し変更して再度アップロードしたところ、ファイルのアタッチメントとしてダウンロードできるようになりました。

@codinghorror .js ファイルのダウンロードを許可することによるセキュリティ上のリスクはありますか?

「いいね!」 1

はい。ファイルが常にディスクにダウンロードされ、決して実行されないことを確認するため、いくつかのブラウザ調査を行う必要があります。

「いいね!」 1

fluiggers.com.br には開発者フォーラムがありますので、ぜひご覧ください。また、よく .js ファイルを共有しています。

「いいね!」 1

はい、js ファイルの許可には多くのセキュリティ上の問題があるため、これについては特に慎重に対応する必要があります。

Content-Disposition ヘッダーは、ダウンロードされた JS ファイルの実行を防止し、正しく設定されています:

attachment; filename="test.js"; filename*=UTF-8''test.js

S3 へのアップロードでは機能しており、ローカルへのアップロードでも機能するはずです。しかし、Rails から新しい(比較的最近の)セキュリティ対策があるようです:

\u003e ActionController::InvalidCrossOriginRequest(セキュリティ警告:別のサイト内の埋め込み\u003cscript\u003e タグが保護された JavaScript を要求しました。ご存知であれば、このアクションでの CSRF 保護を無効にして、クロスオリジン JavaScript の埋め込みを許可してください。)

修正可能でしょう。

「いいね!」 3

私も同じ問題に遭遇しました。コーディングQ&Aフォーラムを持っており、ダウンロード用に大きなjsファイルを共有できるようにする必要があります。

私のコミュニティでも同じ問題が発生しています。人々はJSファイルを共有したいのですが、ダウンロードしようとするとこのエラーが表示されます。

Railsのプロダクションログからの抜粋:

Started GET "/uploads/short-url/qDlrltMxEIJ2aYYdt8lZ200E3wA.js" for 94.31.111.247 at 2025-07-09 05:53:30 +0000
Processing by UploadsController#show_short as JS
  Parameters: {"base62"=>"qDlrltMxEIJ2aYYdt8lZ200E3wA", "extension"=>"js"}
Sent file /var/www/discourse/public/uploads/default/original/1X/baab1fc131be960b601467333f5a690b257daeb0.js (0.3ms)
Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.
Completed 422 Unprocessable Entity in 17ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

JSファイルは許可されているアップロード拡張機能のリストに含まれています。

同じ問題が発生しています。当社のソフトウェア内で実行される JS ファイルがあり、ブラウザで動作するものではありません。

Discourse のダウンロード問題を解決するために、すべてのアップロードを S3 バケットに移動し、s3_use_cdn_url_for_all_uploads を true に設定しました。これにより、JS ファイルの致命的な障害となっている短縮 URL コントローラーが事実上回避されました。

詳細(このプロセスを案内してくれた AI による説明):

  1. S3 互換ストレージの設定(例:Cloudflare R2)

Discourse はローカルディスクから .js ファイルを安全に提供できません。これらをバケットに移動します。

  • バケット: 非公開バケットを作成します(例:my-discourse-bucket)。

  • API キー: アクセスキーとシークレットキーを生成します。

2. カスタム CDN ドメインの設定

Cloudflare(または提供元)で、カスタムドメインをバケットに接続します(例:cdn.example.com)。これにより、ファイルが直接 URL を介して静的アセットとして提供され、Discourse の「セキュリティガード」を回避できます。

3. Discourse 設定の更新

管理画面 → 設定 で、S3 の詳細を設定します。重要なのは、Discourse が URL を一時的なヘッダーで「署名」しようとして破損するのを防ぐために、以下の設定を有効にすることです。

  • s3_use_cdn_url_for_all_uploads: このチェックボックスをオンにしてください(これが最も重要なステップです)。

  • s3_cdn_url: https://cdn.example.com に設定します。

  • s3_region: R2 互換性のために us-east-1 を使用します。

4. 既存のアップロードの移行(オプション)

注:当社の環境では、不明な理由によりこれは機能しませんでした。

既存の投稿内の古いリンクを修正するには、コンテナに入り、以下を実行します。

Bash

# /var/discourse 内
./launcher enter app
rake uploads:migrate_to_s3
rake posts:rebake

誰かの役に立てれば幸いです。