Rails 跨域 ajax 获取请求 (CORS)

Rails cross domain ajax get request (CORS)

我正在尝试在我的 rails 应用程序中实现 google 个位置 api。

这是我在尝试使用从 ajax 请求中获取数据的函数时遇到的错误:

XMLHttpRequest cannot load . Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.

我正在使用 rack-cors gem 并且我已将此代码段添加到我的 config/application.rb 文件中:

config.middleware.insert_before 0, "Rack::Cors" do
      allow do
        origins '*'
        resource '*', :headers => :any, :methods => [:get, :post, :options]
      end
    end

这是我认为的 ajax 请求 (coffeescript):

    $.ajax
      url: url
      dataType: "json"
      type: "GET"

我已将此部分添加到我的 application_controller

before_filter :cors_preflight_check
after_filter :cors_set_access_control_headers

def cors_set_access_control_headers
headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
headers['Access-Control-Allow-Headers'] = '*'
headers['Access-Control-Max-Age'] = "1728000"
end

def cors_preflight_check
if request.method == :options
  headers['Access-Control-Allow-Origin'] = '*'
  headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
  headers['Access-Control-Allow-Headers'] = '*'
  headers['Access-Control-Max-Age'] = '1728000'
  render :text => '', :content_type => 'text/plain'
end
end

还有这个,到我的路线文件

 match '*path' => 'application#cors_preflight_check', :via => :options

我注意到 "cors_preflight_check" 方法不是由我的请求触发的。 (当我在我的视图中单击某个 link 时,我会发出 AJAX 请求)

而且我注意到我的请求 headers 保持不变。

(Access-Control-Allow-Origin 未添加到请求 headers)

jsonp 不是一个选项,因为它不受地方支持 api

尝试了这些线程中的所有内容:

I'm trying to implement google places api in my rails app.

您似乎对 CORS 的作用感到困惑。如果您正在尝试对 https://maps.googleapis.com 执行 ajax 调用,唯一重要的是 CORS headers sent in the response by Google。如果这不起作用,您可能正在尝试使用过时的 api 版本端点。

改为按照以下步骤操作: https://developers.google.com/maps/documentation/javascript/examples/place-search

如果您希望您的应用程序能够向其他域提供数据,那么您可以提供 CORS headers。但这不太可能导致你的问题,除非你正在做一个由单独的 front-end.

使用的 Rails api 应用程序

有关 CORS 工作原理的教程,请参阅 Using CORS

另一方面,CSP (content security policy)允许您为跨域请求设置更宽松的规则。但在这种情况下不需要,因为 Google 为其 Web 服务提供 CORS headers。