34

我编写了一个小型 Rails 应用程序,通过 xmlhttprequests 将内容提供给另一个站点,该站点将从另一个域运行(不可能让它们在同一台服务器上运行)。我知道我需要在我的 rails 服务器上设置 access-control-allow-origin 以允许请求的网页访问此材料。

如何使用 Apache 执行此操作似乎有很好的文档记录,这可能是我在部署站点后将使用的服务器。虽然我正在开发,但我希望只使用 webrick,就像我习惯使用 rails 一样。有没有办法配置 webrick 以在 rails 中提供适当的 http 标头?

4

7 回答 7

78

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' => '*'
})
于 2013-07-23T16:15:21.900 回答
14

如果您使用的是 Rails 2,只需将其添加到您的应用程序控制器中。

before_filter :set_access

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

显然,更改"*"为不那么开放的东西将是一个好主意。

于 2011-01-03T11:58:04.113 回答
14

导轨 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
于 2013-02-06T13:20:31.953 回答
12

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
于 2013-10-27T19:07:37.507 回答
8

导轨 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
于 2011-03-28T10:33:03.537 回答
6

如果您希望将解决方案作为 Rack 中间件 gem: https ://github.com/cyu/rack-cors

于 2014-02-14T18:11:33.710 回答
0

接受的答案有一些对我有用的变化。展示新答案比展示新答案更容易

skip_before_action :verify_authenticity_token
before_action :set_access


def set_access
   headers["Access-Control-Allow-Origin"] = "*"
end
于 2021-01-13T23:18:21.203 回答