Rails CORS - izudon/izudon.github.io GitHub Wiki

結論

  • rack-cors という gem の導入で簡単に実現できる。
    (以下そのマニュアルから抜粋&日本語化)

設定ファイル 書き方

# config/initializers/cors.rb

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'localhost:3000', '127.0.0.1:3000',
            /\Ahttp:\/\/192\.168\.0\.\d{1,3}(:\d+)?\z/
            # regular expressions can be used here

    resource '/file/list_all/', :headers => 'x-domain-token'
    resource '/file/at/*',
        methods: [:get, :post, :delete, :put, :patch, :options, :head],
        headers: 'x-domain-token',
        expose: ['Some-Custom-Response-Header'],
        max_age: 600
        # headers to expose
  end

  allow do
    origins '*'
    resource '/public/*', headers: :any, methods: :get

    # Only allow a request for a specific host
    resource '/api/v1/*',
        headers: :any,
        methods: :get,
        if: proc { |env| env['HTTP_HOST'] == 'api.example.com' }
  end
end
  • この origins から」「この resource に対して
    アクセスがあったものは「通す(許可する)」・・・と読む。
  • origins
    • origins には、「文字列」または「正規表現」または「*」が指定できる。
    • , で区切りながら 複数 指定できる。
    • プロトコル(httphttps)+ サーバ + ポート番号
      の組み合わせのことを「オリジン」という。
      アクセス可否はこの「オリジン」ごとに定められる。
  • resource
    • URLにおけるポート名から先の「パスの部分」を書く。
    • * をワイルドカードとして使用できる。
    • ひとつの origins に対して 複数resource を書ける。
    • :methods :headers などで、許可するものをさらに細かく指定できる。
    • :methods ・・・ 文字列 または 配列 または :any
      • :get [:get, :head] のように、許可するメソッドだけを書く。
        :any ですべて許可 )
      • これ自体を指定しないと・・・
        • 単純な GET なら許可されるが DELETE は許可されない、
          といったような、不可思議な動きとなったので、
          全許可なら :any を指定した方が無難。
    • :headers ・・・ 文字列 または 配列 または :any
      • 'x-domain-token' など、リクエストに含まれて良いヘッダを描く。
    • :expose
      • 研究中。