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



我正在编写一个应用程序,其中包含几个应该可以从任何主机访问的 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是初始值设定项,因此它无法访问传入的请求。有没有办法使源列表动态化,因此它始终只包含请求主机?

您可以使用控制器中的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

如果你这样做?

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

最新更新