Как установить access-control-allow-origin в webrick под рельсами? - PullRequest
34 голосов
/ 29 марта 2010

Я написал небольшое приложение rails для доставки контента на другой сайт через xmlhttprequests, которые будут работать из другого домена (их будет невозможно запустить на том же сервере). Я понимаю, что мне нужно будет установить access-control-allow-origin на моем сервере rails, чтобы разрешить запрашивающей веб-странице доступ к этому материалу.

Кажется, довольно хорошо задокументировано, как это сделать с Apache, и это, вероятно, сервер, который я буду использовать после развертывания сайта. Хотя я и развиваюсь, я надеюсь использовать webrick, как я привык к рельсам. Есть ли способ настроить webrick для предоставления соответствующего заголовка http внутри rails?

Ответы [ 6 ]

77 голосов
/ 23 июля 2013

Рельсы 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' => '*'
})
14 голосов
/ 06 февраля 2013

Рельсы 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
13 голосов
/ 03 января 2011

Если вы на Rails 2, просто добавьте это в контроллер вашего приложения.

before_filter :set_access

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

Очевидно, что изменение "*" на что-то менее открытое было бы хорошей идеей.

12 голосов
/ 27 октября 2013

Rails 3.1 - использование контроллера after_filter у меня не сработало, поэтому вместо него я добавил промежуточное ПО:

В приложении / 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
8 голосов
/ 28 марта 2011

Рельсы 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
6 голосов
/ 14 февраля 2014

В случае, если вам нужно решение в качестве промежуточного ПО Rack: https://github.com/cyu/rack-cors

...