私はRailsアプリケーションにCORSを実装したかったので、グーグルで rack-cors gemを使用しました。そして、READMEで述べられているように、Gemfileを更新しました。それに応じてapplication.rb
を次のように更新しました:
module YourApp
class Application < Rails::Application
# ...
config.middleware.use Rack::Cors do
allow do
origins '*'
resource '*', :headers => :any, :methods => [:get, :post, :options]
end
end
end
end
しかし、それはうまくいきませんでした。何をしても、ブラウザコンソールで次のメッセージが表示され続けます。XMLHttpRequest cannot load https://somewebsite.com. Origin http://0.0.0.0:3000 is not allowed by Access-Control-Allow-Origin.
Githubでこの blogpost および issue を読んだ後、ミドルウェアスタック内のrack-corsミドルウェアの位置が重要であることに気付きました。だから私はgithubの問題で言われたようにした:
module YourApp
class Application < Rails::Application
# ...
config.middleware.insert 0, Rack::Cors do
allow do
origins '*'
resource '*', :headers => :any, :methods => [:get, :post, :options]
end
end
end
end
その後、rake middleware
を実行すると、rack-corsはスタックの一番上にあります。
しかし、それでもまだ機能しません。同じエラーが発生し続けます。誰でも助けてください。
Herokuで同じ問題に遭遇しました。私は このブログ を同じrack-corsの問題で見つけました。
use Rack::Cors
をconfig.ru
に移動し、herokuに再デプロイすると動作します。
require ::File.expand_path('../config/environment', __FILE__)
run Rails.application
require 'rack/cors'
use Rack::Cors do
# allow all origins in development
allow do
origins '*'
resource '*',
:headers => :any,
:methods => [:get, :post, :delete, :put, :options]
end
end
Herokuソリューション用の新しい issue スレッドがあります
使用する代わりに
config.middleware.use Rack::Cors do
試す
config.middleware.insert_before ActionDispatch::Static, Rack::Cors do
それでうまくいきました。
私はオプションのリクエストを処理するために特別なルートを作成する必要がありましたが、cors gemは期待どおりにそれを行いませんでした。 routes.rbの最後に追加したルートは次のとおりです。
match "*path", :to => proc {|env| [200, {
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Credentials' => 'true',
'Access-Control-Request-Method' => '*',
'Access-Control-Allow-Headers' => 'Origin, X-Requested-With, Content-Type, Accept, Authorization',
'Content-Type' => 'text/plain'
}, ["CORS Preflight"]] }, :via => [:options]
これが私の修正方法です:
GemfileでRack CORS gemのコメントを外すか(存在する場合)、または追加するだけです。
gem 'rack-cors'
次に、以下のコードを実行してgemをインストールします。
bundle install
以下のコードをconfig/application.rb
of your Rails application。たとえば、これにより、GET、POST、または任意のリソース上の任意のOriginからのOPTIONSリクエストが許可されます。
module YourApp
class Application < Rails::Application
# ...
# For Rails 5 Appications
config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
resource '*', headers: :any, methods: [:get, :post, :options]
end
end
# For Rails 3/4 Applications
config.middleware.insert_before 0, "Rack::Cors" do
allow do
origins '*'
resource '*', headers: :any, methods: [:get, :post, :options]
end
end
end
end
オリジンを「*」に設定しても問題ありませんが、本番環境にデプロイする場合は、セキュリティ上の理由から、この値をフロントエンドのURIと一致するように変更する必要があることに注意してください。
注: Railsを実行している場合は、config/application.rb
で十分です。 config.ruも更新する必要はありません。
それで全部です
これが役に立てば幸いです。
結局のところ、このgemにはherokuにいくつかの問題があることが判明しました。ローカルマシンでは、このgemは完全に正常に動作します。
追加またはコメント解除したことを確認してくださいgem 'rack-cors'
Gemfile内