我想在我的rails应用程序中实现CORS,所以我用Google搜索了rack-cors gem。我按照README中的说法完成了所有操作,相应地更新了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上阅读这篇blogpost和issue后,我意识到中间件堆栈中的机架中间件的位置可能很重要。所以我按照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 middleware
时,rack-cors真的处于堆栈的顶端。
但它仍然只是根本不起作用。我一直得到同样的错误。任何人,请帮忙。
我和heroku遇到了同样的问题。我发现this blog有相同的rack-cors问题。
刚刚将use Rack::Cors
移动到config.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
heroku解决方案有一个新的issue线程
而不是使用
config.middleware.use Rack::Cors do
尝试
config.middleware.insert_before ActionDispatch::Static, Rack::Cors do
这对我有用。
我不得不创建一个特殊的路线来处理选项请求,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]
您只需要在Gemfile中取消注释Rack CORS gem(gemfile.rb)
#Jingle
gem 'rack-cors'
然后运行下面的代码来安装gem
bundle install
并确保您的cors初始化程序(cors.rb)以这种方式设置#config / initializers / cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
resource '*',
headers: :any,
methods: [:get, :post, :put, :patch, :delete, :options, :head]
end
end
将原点设置为'*'应该可以进行开发,但请记住,如果部署到生产环境,则出于安全原因,您需要更改此值以匹配前端的URI。
我希望这有帮助。
如果有帮助,请将此答案视为有用,或在答案下方进行评论以获得更多说明。
毕竟它出现了这个宝石与heroku有一些问题,在本地机器上它完全正常。
确保在Gemfile中添加或取消注释gem 'rack-cors'