我已经写了一个小的Rails应用程序通过将来自另一个域操作的XMLHttpRequest就可以提供内容到另一个站点(这是不可能的,让他们在同一台服务器上运行)。我明白我需要设置访问控制允许来源我的rails服务器上允许请求的网页访问此材料。

看来相当有据可查如何与Apache做到这一点,这可能是一次我部署站点,我将使用的服务器。虽然我发展,虽然我希望只使用的WEBrick因为我用来与轨道做。有配置的WEBrick到导轨内提供适当的HTTP标头的方法吗?

有帮助吗?

解决方案

如果你对Rails的2只添加到您的应用程序控制器上。

before_filter :set_access

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

显然改变"*"的东西少一点开放将是一个不错的主意。

其他提示

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

在配置/ application.rb中:

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

3.1的Rails

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

Rails的3.1 - 使用控制器after_filter没有工作的我,所以我增加了一个自定义的中间件,而不是:

在应用/中间件/ 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

在配置/ 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

的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

在的情况下所需的溶液作为Rack中间件宝石: https://github.com/cyu/rack-cors

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top