我想在我的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
时,机架真正处于堆栈顶部
但它仍然只是根本不起作用。我一直得到同样的错误。任何人,请帮忙。
答案 0 :(得分:17)
我遇到了与heroku相同的问题。我发现this blog有同样的机架问题。
刚刚将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
答案 1 :(得分:10)
heroku解决方案有一个新的issue主题
而不是使用
config.middleware.use Rack::Cors do
尝试
config.middleware.insert_before ActionDispatch::Static, Rack::Cors do
这对我有用。
答案 2 :(得分:2)
我必须创建一个特殊的路线来处理选项请求,cors gem并没有像我预期的那样为我做这件事。我添加到routes.rb末尾的路线是:
Posts::with(['replies' => function($query) {
$query->orderBy('id');
}])->find($pin_id);
答案 3 :(得分:0)
毕竟它出现了这个宝石与heroku有一些问题,在本地机器上它完全正常。
答案 4 :(得分:0)
确保在Gemfile中添加或取消注释gem 'rack-cors'
答案 5 :(得分:0)
您只需要取消注释Gemfile(gemfile.rb)中的Rack CORS gem
#gemfile.rb
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相匹配。
我希望这会有所帮助。
在有帮助的情况下将此答案赞为有用,或在答案下方评论以进一步说明。