web-dev-qa-db-ja.com

railsの下のwebrickでaccess-control-allow-Originを設定する方法は?

私は小さなRailsアプリを作成して、別のドメインから動作するxmlhttprequestsを介してコンテンツを別のサイトに提供します(同じサーバーで実行することはできません)。 Railsサーバーでaccess-control-allow-Originを設定して、要求しているWebページがこの資料にアクセスできるようにする必要があります。

Apacheでこれを行う方法はかなりよく文書化されているようで、これはおそらく、サイトをデプロイした後に使用するサーバーです。開発中ですが、Railsで慣れているようにwebrickだけを使用したいと思っています。 Rails内に適切なhttpヘッダーを提供するようにwebrickを構成する方法はありますか?

34
brad

Rails 2を使用している場合は、これをアプリケーションコントローラーに追加するだけです。

before_filter :set_access

def set_access
  @response.headers["Access-Control-Allow-Origin"] = "*"
end

明らかに変化する"*"少しオープンなものにすると良いでしょう。

13
thomasfedb

Rails 4( http://edgeguides.rubyonrails.org/security.html#default-headers

Config/application.rb:

config.action_dispatch.default_headers.merge!({
  'Access-Control-Allow-Origin' => '*',
  'Access-Control-Request-Method' => '*'
})
78
Jared Fine

Rails 3.1

class ApplicationController < ActionController::Base
  protect_from_forgery
  after_filter :set_access_control_headers

  def set_access_control_headers
    headers['Access-Control-Allow-Origin'] = '*'
    headers['Access-Control-Request-Method'] = '*'
  end
end
14
freemanoid

Rails 3.1-コントローラafter_filterを使用しても機能しなかったため、代わりにカスタムミドルウェアを追加しました。

App/middleware/cors_middleware.rbで:

# For icons to work in Firefox with CDN
class CorsMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)
    cors_headers = headers.merge({
      'Access-Control-Allow-Origin' => '*',
      'Access-Control-Request-Method' => '*'        
    })
    [status, cors_headers, body]
  end  
end

Config/application.rb:

require File.join(Rails.root, "app", "middleware", "cors_middleware")
config.middleware.insert_before ActionDispatch::Static, CorsMiddleware # Need it early in the chain to work for assets
12
Peter Marklund

Rails 2.3.8

before_filter :allow_cross_domain_access
def allow_cross_domain_access
  response.headers["Access-Control-Allow-Origin"] = "*"
  response.headers["Access-Control-Allow-Methods"] = "*"
end
8
grosser

Rackミドルウェアgemとしてソリューションが必要な場合: https://github.com/cyu/rack-cors

6
demisx