【问题标题】:How to set allowed origin to request host in Rails 5如何在 Rails 5 中设置允许的来源以请求主机
【发布时间】:2018-11-13 23:10:30
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    如果你这样做呢?

    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
    

    【讨论】:

    • 这只是设置Access-Control-Allow-Origin: * 还是将值设置为请求来源?
    【解决方案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
    

    【讨论】:

    • 正是我想要的。谢谢!
    猜你喜欢
    • 2018-06-02
    • 2020-12-29
    • 2019-05-28
    • 2016-07-16
    • 2022-06-15
    • 2018-04-27
    • 2012-03-19
    • 1970-01-01
    • 2018-08-28
    相关资源
    最近更新 更多