Rails:在哪里启用 Access-Control-Allow-Origin

Posted

技术标签:

【中文标题】Rails:在哪里启用 Access-Control-Allow-Origin【英文标题】:Rails: where to enable Access-Control-Allow-Origin 【发布时间】:2017-02-21 20:47:02 【问题描述】:

我正在尝试在我的咖啡脚本文件中加载一个链接,如下所示:

$.ajax hobby.link,
  type: 'GET'
  dataType: 'html'
  error: (jqXHR, textStatus, errorThrown) ->
    console.log "AJAX Error"
  success: (data, textStatus, jqXHR) ->
    console.log "Successful AJAX call"

并已安装

gem 'rack-cors', :require => 'rack/cors'

并添加了

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

到我的 application.rb,但每次我得到

XMLHttpRequest 无法加载 http://www.example.com/。请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://localhost:3000' 因此不允许访问。

我还需要做什么才能使这些负载起作用?

请注意,我目前正在对三个不同的链接连续执行 ajax 调用。

【问题讨论】:

cannot load http://www.example.com/ 你确定用ajax 查询localhost:3000 吗? @amingilani 你能详细说明一下吗?我不确定你在问我什么。 上面的错误是XMLHttpRequest cannot load http://www.example.com/,检查你的ajax代码看看你有没有硬编码example.com 我只是把那个链接作为一个例子。我尝试加载的实际链接也是其他第三方 URL 【参考方案1】:

Rack::Cors 处理允许或拒绝 您自己的 网站和域的 CORS。它不会影响任何其他域的 CORS 配置。

例如,您的网站可能是 http://example.com,而您正尝试向 http://example.net 发送 AJAX 请求。由于 example.net 不受您的控制,因此您无法控制其 CORS 设置,Rack::Cors 也无法控制。这意味着如果 example.net 已禁止 AJAX 请求,您将无能为力。

与您尝试调用的服务的管理员交谈,看看您是否可以说服他们允许 AJAX 请求(至少来自您的域)。

【讨论】:

【参考方案2】:

错误代码表明您尝试加载的第 3 方网站不允许来自其域外的请求。这不是您的应用程序的问题,它们不允许不是来自自己域的请求。

这是针对CSRF 攻击的措施。有关 CORS 工作原理的说明,请参阅 this 答案。

【讨论】:

这些网站是公共域 @rigdonmr 是的,但他们不允许来自他们自己域之外的 ajax 请求。基本上,当您的浏览器向 siteA 发送来自 siteLocalhost 的请求时,siteA 会为您的浏览器提供该请求应该来自的域的白名单,而 siteLocalhost 不在其中。见***.com/a/21310171/3970701 那么此链接中的教程适用于哪些情况:html5rocks.com/en/tutorials/cors? 哪个链接?我想我们应该拿这个来聊天。 我之前评论中的链接

以上是关于Rails:在哪里启用 Access-Control-Allow-Origin的主要内容,如果未能解决你的问题,请参考以下文章

[prometheus,rails]如何在rails服务器上启用prometheus

Ruby/Rails:生成脚手架的代码在哪里

如何在 Rails 4 应用程序中启用 CORS

Rails 5 成功发送数据后重新启用表单提交

硬删除在rails中启用软删除的关联记录

在 bootstrap rails datepicker 上启用多日期