25

我想在我的 Rails 应用程序中实现 CORS,所以我用谷歌搜索了rack-cors gem。我按照自述文件中的说明做了所有事情,相应地更新了 Gemfile 并更新application.rb如下:

module YourApp
  class Application < Rails::Application

    # ...

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

  end
end

但它没有用。不管我做了什么,在浏览器控制台中我不断收到消息:
XMLHttpRequest cannot load https://somewebsite.com. Origin http://0.0.0.0:3000 is not allowed by Access-Control-Allow-Origin.

在阅读了这篇文和github 上的issue之后,我意识到 rack-cors 中间件在中间件​​堆栈中的位置可能很重要。所以我按照github问题中的说明做了:

module YourApp
  class Application < Rails::Application

    # ...

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

  end
end

之后,当我运行rake middlewarerack-cors 时,它确实位于堆栈的顶部。
但它仍然根本行不通。我不断收到同样的错误。任何人,请帮助。

4

6 回答 6

21

我遇到了与heroku相同的问题。我发现这个博客有同样的 rack-cors 问题。

刚刚移动use Rack::Corsconfig.ru,重新部署到heroku,它就可以工作了。

require ::File.expand_path('../config/environment',  __FILE__)
run Rails.application

require 'rack/cors'
use Rack::Cors do

  # allow all origins in development
  allow do
    origins '*'
    resource '*', 
        :headers => :any, 
        :methods => [:get, :post, :delete, :put, :options]
  end
end
于 2013-12-09T07:01:04.127 回答
13

heroku 解决方案有一个新的问题线程

而不是使用

config.middleware.use Rack::Cors do

尝试

config.middleware.insert_before ActionDispatch::Static, Rack::Cors do

这对我有用。

于 2013-09-19T19:02:54.527 回答
2

我必须创建一个特殊的路由来处理选项请求,cors gem 并没有像我预期的那样为我做这件事。我添加到 routes.rb 末尾的路线是:

  match "*path", :to => proc {|env| [200, {
  'Access-Control-Allow-Origin' => '*',
  'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS',
  'Access-Control-Allow-Credentials' => 'true',
  'Access-Control-Request-Method' => '*',
  'Access-Control-Allow-Headers' => 'Origin, X-Requested-With, Content-Type, Accept, Authorization',
'Content-Type' => 'text/plain'

 }, ["CORS Preflight"]] }, :via => [:options]
于 2016-09-17T21:47:19.007 回答
2

这是我修复我的方法:

您只需在 Gemfile 中取消注释 Rack CORS gem(如果存在)或添加它:

gem 'rack-cors'

然后运行下面的代码来安装gem:

bundle install

将下面的代码放入config/application.rb您的 Rails 应用程序中。例如,这将允许来自任何资源的任何来源的 GET、POST 或 OPTIONS 请求:

module YourApp
  class Application < Rails::Application
    # ...

    # For Rails 5 Appications

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

    # For Rails 3/4 Applications

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

将 origin 设置为 '*' 对于开发应该没问题,但请记住,如果您部署到生产环境,出于安全原因,您需要更改此值以匹配前端的 URI。

注意:如果你正在运行 Rails,更新config/application.rb就足够了。也不需要更新 config.ru。

就这样

我希望这有帮助。

于 2019-04-16T20:23:45.200 回答
0

毕竟,这个 gem 与 heroku 有一些问题,在本地机器上它工作得很好。

于 2013-08-30T19:29:42.627 回答
-2

确保您gem 'rack-cors'在 Gemfile 中添加或取消注释

于 2018-01-04T13:03:19.603 回答