CORSとJavaScriptクライアントの問題?間違い!カスタムAPIエンドポイント経由でアップロードしようとした際に client_max_body_size が正しく設定されていませんでした

カスタムエンドポイントを使用して、Web サイトからユーザー API を介してファイルをアップロードしようとしています。

ログインできるのは管理者ユーザーのみです。
ファイルのアップロードを除けば、他のことは何でもできます。

> [エラー] Access-Control-Allow-Origin によって https://my.domain のオリジンは許可されていません。
> [エラー] アクセス制御チェックにより、Fetch API は https://my.domain/m/upload.json を読み込めません。
> [エラー] リソースの読み込みに失敗しました: Access-Control-Allow-Origin によって https://my.domain のオリジンは許可されていません。(upload.json、行 0)
> [ログ] API-CALL-ERROR – "/m/upload.json" – TypeError: Access-Control-Allow-Origin によって https://my.domain のオリジンは許可されていません。(app.8eb0470a.chunk.js、行 1)
> TypeError: Access-Control-Allow-Origin によって https://my.domain のオリジンは許可されていません。

Settings CORS に https://my.domainhttp://localhost:19006(テスト用)を追加し、app.yml に DISCOURSE_ENABLE_CORS true を追加しました。

また、app.yml の DISCOURSE_CORS_ORIGINhttps://my.domain を追加してみましたが、これも機能しませんでした。

何が足りないのでしょうか?

/shared/log/rails/production.log には、Screen Shot 2020-09-16 at 14.44.02 という画像しか表示されていません。

TL;DR
関与するすべての nginx またはサーバーを確認してください。私の場合は、ウェブサイト、Discourse の Docker、そして Discourse Docker の内部の 3 つです。client_max_body_size は、アップロード時に設定したい制限値に設定してください。

私は「client_max_body_size 999m」を選択しましたが、これは Discourse の設定からのみ制限をかけるためです。この行を nginx.conf 内の http タグまたは server タグ内に追加できます。安全のために最後の行に追加するのがおすすめです :slight_smile:

詳しい説明:
1 日中掘り下げて Firefox をダウンロードし続けました(Web 開発には完全に推奨します)。アップロードができなかった理由は、Discourse の Docker コンテナ内の nginx によって設定された制限によるものであることがわかりました(「いや、それは launcher が再構築された際に動的に設定されるはずだ」と言う人もいるかもしれませんが、私は確実性を好みます :))。さらに、Docker イメージをホストしている自前の nginx にも制限が設定されておらず、デフォルトで「client_max_body_size 1MiB」になっていたため、これでは不十分でした(:)。これも変更した後、フロントエンドの nginx にも同様の設定変更を行う必要がありました。3 回の変更、nginx での CORS プリフライトリクエスト管理との 6 時間にわたる試行錯誤、そして少しのストレスを経て、今では正常に動作しています。

「いいね!」 2