如何在Rails 5中设置允许的源请求主机

时间:2018-06-04 15:04:59

标签: ruby-on-rails ruby cors ruby-on-rails-5

我正在编写一个带有几个API的应用程序,这些API应该可以从任何主机访问。现在,到目前为止,我已经通过以下方式在application.rb处理了这个问题:

config.action_dispatch.default_headers = {
  'Access-Control-Allow-Origin' => '*'
}

但是,访问API的其中一个客户端不允许从定义'*'的源获取数据。我的想法是将允许的源动态设置为请求API的源。像这样:

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins ActionDispatch::Request.headers['Host']

    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

但是由于cors.rb是一个初始化程序,它无法访问进来的请求。有没有办法让原点列表动态化,所以它总是只包含请求主机?

2 个答案:

答案 0 :(得分:3)

如果你这样做?

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    # this proc should return true or false
    origins { |source, env| true }
    resource '*', headers: :any, methods: %i[get post put patch delete options head]
  end
end

答案 1 :(得分:2)

您可以在控制器中使用before_action执行此操作。

class ApiBaseController < ApplicationController
  before_action :set_cors_headers

  private

  def set_cors_headers
    response.set_header "Access-Control-Allow-Origin", origin
  end

  def origin
    request.headers["Origin"] || "*"
  end
end