状況:
プラグインを開発中で、nginx を Rails:3000 へのリバースプロキシとして使用していますが、すべてうまくいっているにもかかわらず、API へのアクセスで誰もが「愛する」嫌な CORS エラーに直面しています。
Access to XMLHttpRequest at 'blah blah blah' from origin 'foo bar bing' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
これまでに、nginx にヘッダーを追加しようとしましたが、何らかの理由で、Chrome でデバッグした際にそれらのヘッダーが表示されません。
また、Rails の proxy_headers を nginx に変更するために nginx を使用しようとしましたが、これも成功しませんでした。
さらに、ヘッダーを挿入するための Chrome 拡張機能プラグインを使用してみましたが、ブラウザの CORS テストサイトで CORS テストを行った結果、すべて許可されていると表示されているにもかかわらず、これも機能しません。
その後、rack-cors gem を追加しようとしましたが、freeze エラーのため config.middleware が機能しませんでした。
これで開発が停滞しており、行き詰まったようです
Discourse の設定ファイル(できればプラグイン内)で直接これらのヘッダーを追加し、開発環境でテストおよび送信したい HTTP ヘッダーを送信する方法はありませんか?
あるいは、rack-cors gem を機能させることは可能でしょうか?可能であれば、プラグインのどこにコードを追加すればよいでしょうか?
参考: RubyDoc.info: File: README – Documentation for rack-cors (0.4.0) – RubyDoc.info
前述の通り、これまでに試した多くの方法や上記の RubyDocs に記載された方法はいずれも「ここでは機能しない」という結果に終わり、同じことの繰り返しです。
一時的に CORS を忘れ、単一の HTTP キャッシュヘッダーを追加しようとしましたが、これも私の側では行き詰まりました。
おそらく、誰もがこれらの CORS 関連の問題を笑い飛ばすでしょうし、私も同様です。しかし、もし開発テスト環境で独自のテストヘッダー(CORS かどうかは問いません)を追加する方法を共有していただければ、大変感謝いたします。
ありがとうございます。
sam
(Sam Saffron)
2020 年 5 月 18 日午前 5:38
2
標準の CORS サポートと cors_origins サイト設定が機能していない理由がありますか?
def call(env)
cors_origins = @global_origins || []
cors_origins += SiteSetting.cors_origins.split('|') if SiteSetting.cors_origins.present?
cors_origins = cors_origins.presence
if env['REQUEST_METHOD'] == ('OPTIONS') && env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']
return [200, Discourse::Cors.apply_headers(cors_origins, env, {}), []]
end
env[Discourse::Cors::ORIGINS_ENV] = cors_origins if cors_origins
status, headers, body = @app.call(env)
headers ||= {}
Discourse::Cors.apply_headers(cors_origins, env, headers) if cors_origins
[status, headers, body]
end
This file has been truncated. show original
こんにちは、@sam さん
CORS サポートのビルド機能が私の環境で動作しない理由がわかりません。```
ワイルドカード

すみません、これは最初の投稿(OP)で触れていました……
sam:
if env['REQUEST_METHOD'] == ('OPTIONS') && env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']
return [200, Discourse::Cors.apply_headers(cors_origins, env, {}), []]
end
もしかして、この ENV を設定する必要があるのでしょうか?
if env['REQUEST_METHOD'] == ('OPTIONS') && env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']
return [200, Discourse::Cors.apply_headers(cors_origins, env, {}), []]
end
何か ENV 変数を設定する必要があるのでしょうか?もしそうなら、どこで設定すればよいのでしょうか?もしかしたら私の失敗なのでしょうか?
ありがとうございます!
参考までに、プラグインのイニシャライザーで以下を設定しました:
Discourse.SiteSettings.discourse_enable_cors = true;
Discourse.SiteSettings.discourse_cors_origin = "*";
そして、console.log で確認すると、これらの設定は問題ないようですが……それでもコンソールには相変わらず「アクセス拒否」のエラーが表示されたままです