我正在编写一个带有几个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
是一个初始化程序,它无法访问进来的请求。有没有办法让原点列表动态化,所以它总是只包含请求主机?
答案 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