🦁
has been blocked by CORS policy に対処する
事象
Rails + React(Typescript) でアプリを作っていたところ、API呼び出し部分で以下のようなエラーが発生したため対処する。
Access to XMLHttpRequest at 'http://localhost:3000/api/v1/posts' from origin 'http://localhost:3001' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
環境
- バックエンド: Rails
- オリジン: http://localhost:3000
- フロント: React (TypeScript)
- オリジン: http://localhost:3001
原因
バックエンドとフロントのオリジンが違い、かつバックエンド側で異なるオリジンからのアクセス(CIOS)を許可していないために起こる。
オリジンとCIOSの説明は https://qiita.com/att55/items/2154a8aad8bf1409db2b を見ると良い。
対処方法
サーバー側でフロントからのアクセス(http://localhost:3001)を許可する。
もちろんバックエンドとフロントエンドのオリジンを統一(Railsでフロントも作る)すればこの問題は起こらないが、今回のように別フレームワークで作っているような場合はオリジンが別れてしまうため、サーバー側で特定のオリジンからのアクセスを許可する必要がある。
やり方
- Gemfile 内にある
gem 'rack-cors'
のコメントアウトを外す bundle install
-
config/initializers/cors.rb
の以下の部分に許可したいオリジンを記述する。Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do ## 今回だと許可したいオリジンは http://localhost:3001 なのでこれを記述する origins 'http://localhost:3001' resource '*', headers: :any, methods: [:get, :post, :put, :patch, :delete, :options, :head] end end
-
bin/rails s
-
cors.rb
はinitializers
配下に記述しているので、起動時に読み込まれる。そのため、もしサーバー起動中に書き換えた場合は書き換え後に再起動する。
-
Discussion