Ruby on Rails - AJAX 请求不起作用(跨域),尝试了一切

Posted

技术标签:

【中文标题】Ruby on Rails - AJAX 请求不起作用(跨域),尝试了一切【英文标题】:Ruby on Rails - AJAX request not working (cross-origin), tried everything 【发布时间】:2015-09-23 16:30:57 【问题描述】:

(抱歉英语不好) 我尝试执行 ajax 请求,但由于同源策略而无法正常工作。我的应用程序尚未部署,我使用 Ruby on Rails 3.2.3 和 Unicorn 服务器。

AJAX 请求位于资产 javascript 文件中,我在视图中调用它。当我尝试从 AJAX 请求中获取数据时,控制台说 “跨域请求被阻止:同源策略不允许读取 [url] 处的远程资源。这可以通过将资源移动到同一域或启用 CORS 来解决。”

我什么都试过了:

在ajax请求中使用jsonp:console.log说语法错误 使用 rack cors,使自述文件 (https://github.com/cyu/rack-cors) 中所说的一切,但它不起作用,控制台中的消息仍然相同(是否重新启动服务器) 尝试一些关于 rack-cors 的语法,在我能找到的堆栈溢出的每篇文章中都提到,我试过这个:

应用程序.rb:

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

但它不起作用,我在 config.ru 中尝试了这个

use Rack::Cors do

  # allow all origins in development
  allow do
    origins 'localhost:3000'
    resource '*',
         :headers => :any,
         :methods => [:get, :post, :delete, :put, :options]
  end
end

我用 "origins 'localhost:3000'" 和 "origins '*'" 尝试了这段代码,但它们都不起作用,我没有忘记 "require 'rack/cors'"

我很绝望,你能帮帮我吗?

【问题讨论】:

你用的是什么浏览器? Chrome 会在内部阻止此类行为。在你的 bash $open -a Google\ Chrome --args --disable-web-security 中运行将关闭此功能。 我用的是firefox,但应用程序也需要在chrome中运行。 我要问:你修改你的application.rb文件后是否重启了你的rails服务器? 是的,每次更改后我都会重新启动 如果您仍然需要这方面的帮助,请尝试确保方法数组中包含所有 HTTP 动词。如果这仍然不起作用,请发布您的控制器代码。你可能需要skip_before_filter :verify_authenticity_token。如果这不起作用,请检查您的路线和命名空间。 【参考方案1】:

我们遇到过类似的情况,使用 rack-cors 解决了

基因文件:

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

应用程序.rb:

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

别忘了重启你的 Rails 服务器!

编辑:

我突然想到,如果您将应用服务器也用作 Web 服务器,这只会在生产中工作。如果您使用 nginx 或 Apache 作为您的 Web 服务器,那么您的静态资产将由它提供。您必须在 Nginx/Apache 上启用 CORS。

【讨论】:

所以这就是为什么它对我不起作用!我已经使用 rack-cors (完全相同的代码),但我怎样才能让它在开发模式下工作? 我只是测试它,即使在生产模式下它仍然无法正常工作 =/【参考方案2】:

几乎毫无疑问,您没有定义正确的标头以允许访问。以下演练应该可以帮助您:

http://dotnet-concept.com/Tip/2015/3/5798824/Cross-Origin-Request-Blocked-The-Same-Origin-Policy-disallows-reading-the-remote-resource-This-can-be-fixed-by-moving-the-resource-to-the-same-domain-or-enabling-CORS-

【讨论】:

我设置了与教程中描述的相同的标题,没有任何改变

以上是关于Ruby on Rails - AJAX 请求不起作用(跨域),尝试了一切的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on rails - 更新 ajax 的 PUT 方法

jquery .ajax 对 ruby​​ on rails 服务器的 post 请求在客户端出现 JSON.parse 错误

Ruby on Rails,json vs js ajax 响应

Ruby on Rails AJAX文件上传

使用 ajax 刷新页面时,Ruby on Rails 失败

Ruby on Rails 6. 使用带有 Ajax 的 Bootstrap 4 工具提示