如何在rails下的webrick中设置access-control-allow-origin?

bra*_*rad 34 ajax ruby-on-rails xmlhttprequest webrick cors

我已经编写了一个小型rails应用程序,通过xmlhttprequests向另一个站点提供内容,这些站点将在另一个域上运行(无法让它们在同一台服务器上运行).我知道我需要在我的rails服务器上设置access-control-allow-origin,以允许请求的网页访问这些资料.

似乎有很好的文档说明如何使用Apache,这可能是我部署网站后将使用的服务器.虽然我正在开发,但我希望只使用webrick,因为我习惯使用rails.有没有办法配置webrick以在rails中提供适当的http标头?

小智 77

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' => '*'
})
Run Code Online (Sandbox Code Playgroud)

  • 更新了不删除现有默认标头的答案 (14认同)
  • +1请注意,上面的代码也会删除现有的默认标头(X-Frame-Options,X-XSS-Protection,X-Content-Type-Options) (6认同)
  • 我认为为这样的所有域启用CORS会产生一些重大的安全影响.https://code.google.com/p/html5security/wiki/CrossOriginRequestSecurity (2认同)

fre*_*oid 14

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
Run Code Online (Sandbox Code Playgroud)


tho*_*edb 13

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

before_filter :set_access

def set_access
  @response.headers["Access-Control-Allow-Origin"] = "*"
end
Run Code Online (Sandbox Code Playgroud)

显然,改变"*"一些不那么开放的东西是个好主意.

  • 和轨道3? (4认同)
  • 也许铁路4?编辑:rails 4在下面;)http://stackoverflow.com/a/17815546/845717 (3认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)


gro*_*ser 8

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
Run Code Online (Sandbox Code Playgroud)


dem*_*isx 6

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