Heroku、Rails 4 和 Rack::Cors
Posted
技术标签:
【中文标题】Heroku、Rails 4 和 Rack::Cors【英文标题】:Heroku, Rails 4, and Rack::Cors 【发布时间】:2013-11-25 04:39:24 【问题描述】:我正在尝试将 Rack::Cors 与我的 Rails 4 应用程序一起使用,以便我可以执行基于 JSON 的 API。
CORS 在我的 Gemfile 中是这样的:
gem 'rack-cors', :require => 'rack/cors'
我正在我的 application.rb 文件中进行这样的配置:
config.middleware.insert_after Rails::Rack::Logger, Rack::Cors, :debug => true, :logger => Rails.logger do
allow do
origins '*'
resource '/messages*', :headers => :any, :methods => [:post, :options]
end
end
我在Rails::Rack::Logger
之后插入以尝试获取调试信息。
我正在使用 CURL 来测试它,这是我一直在运行的:
curl --verbose --request OPTIONS http://jasonbutzinfo.herokuapp.com/messages.json --header 'Origin: http://www.jasonbutz.info' --header 'Access-Control-Request-Headers: Origin, Accept, Content-Type' --header 'Access-Control-Request-Method: POST'
当我在本地机器上运行 rails 应用程序时,它可以正常工作。当我点击 Heroku 应用程序时,这就是我得到的:
> OPTIONS /messages.json HTTP/1.1
> User-Agent: curl/7.30.0
> Host: jasonbutzinfo.herokuapp.com
> Accept: */*
> Origin: http://www.jasonbutz.info
> Access-Control-Request-Headers: Origin, Accept, Content-Type
> Access-Control-Request-Method: POST
>
* Empty reply from server
* Connection #0 to host jasonbutzinfo.herokuapp.com left intact
curl: (52) Empty reply from server
我确实找到了这个问题 (Can't get rack-cors working in rails application),但没有提供任何有用的答案。
更新 2013 年 11 月 13 日 16:40 EST
我一直在尝试对正在发生的事情进行更多调试。我已经修补了一些 Rack::Cors 的方法,看看它们是否在 Heroku 上被调用。我还更改了将 Cors 插入机架中间件堆栈顶部的位置。
通过我的猴子补丁,我将puts
语句放入initialize
、call
和allow
方法中。 initialize
和 allow
方法都被调用。 call
方法永远不会被调用。所以似乎有什么东西在请求到达 cors 中间件之前阻止了它。
【问题讨论】:
你有没有想过这个问题?我一直在间歇性地工作....虽然根本不知道如何在heroku上调试它。 :( @Mark37 我还没弄明白。 我发誓我昨天刚刚让它工作了。有趣的是,heroku 日志甚至没有记录我的 OPTIONS 请求,所以我提交了一份支持票,并查看 heroku 路由器是否发生了问题。如果我听到任何消息,我会回复。 另外一个奇怪的事实是,如果我的服务由于空闲而停止,并且我尝试发出该 curl OPTIONS 请求,则测功机将不会再次启动。只有当我发出 GET、POST、PUT、DELETE 时,测功机才会开始旋转。 【参考方案1】:我在使用 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
【讨论】:
【参考方案2】:问题似乎是由我的机器或我所在的网络引起的。我通过 SSH 连接到我使用的托管环境并使用了上面的 curl 命令,它工作正常。
补充说明 这是刚刚发生的其他事情,我认为我应该补充一下。我的 AJAX 请求不是针对我的 Heroku 应用程序的 https URL,而是 Heroku 将其翻译为 https。这导致了一个额外的跨域问题。将 AJAX 请求切换为使用 https 解决了这个问题。
【讨论】:
我可以确认这也是我的情况 - 但我真的很想知道为什么这使得无法从这个特定的网络使用我的 web 应用程序。【参考方案3】:好的,感谢 Jason,我能够为我找出根本原因。我安装了 Cisco AnyConnect *** 客户端,它阻止了 CORS 请求。
您可以在此处了解更多信息: http://www.bennadel.com/blog/2559-Cisco-AnyConnect-***-Client-May-Block-CORS-AJAX-OPTIONS-Requests.htm
突然卸载它可以让一切正常工作!
【讨论】:
这完全是我们的问题!没有 *** 的计算机很好,而那些有问题的计算机。我们的默认系统映像会安装它,所以我们也必须手动杀死它。非常感谢,Mark37 :-)【参考方案4】:我遇到了类似的问题,我无法从 angularjs 的响应中读取 Location 标头,即使我可以在 chrome 的开发工具中看到它。我有这样的 Rack::Cors 设置:
config.middleware.insert_before "ActionDispatch::Static", "Rack::Cors" do
allow do
origins '*'
resource '*',
headers: :any,
methods: [:get, :post, :delete, :put, :patch, :options, :head],
max_age: 0
end
end
我的解决方案是将位置添加到 :expose 选项中,然后我可以在 angularjs 中看到它:
config.middleware.insert_before "ActionDispatch::Static", "Rack::Cors" do
allow do
origins '*'
resource '*',
headers: :any,
methods: [:get, :post, :delete, :put, :patch, :options, :head],
max_age: 0,
expose: :location
end
end
【讨论】:
【参考方案5】:试试
config.middleware.insert_before ActionDispatch::Static, Rack::Cors do
# ...
end
【讨论】:
【参考方案6】:如果您使用的是 Rails 6:
首先转到您的Gemfile
并取消注释gem 'rack-cors'
。然后运行bundle install
之后转到config/initializers
文件夹。在那里,您应该会找到一个名为 cors.rb
的文件。
取消注释看起来像这样的代码
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins 'example.com'
resource '*',
headers: :any,
methods: [:get, :post, :put, :patch, :delete, :options, :head]
end
end
将显示origins 'example.com'
的行更改为origin '*'
,或者如果您的请求将来自特定来源,则进行相应设置。
这对我有用。希望它也适用于你。干杯
【讨论】:
以上是关于Heroku、Rails 4 和 Rack::Cors的主要内容,如果未能解决你的问题,请参考以下文章
Rails 5.2 和 webpacker 3.4.3:部署到 Heroku 时资产未编译
Heroku 不会在 Rails 4 中的资产管道下编译文件
在'rake assets:precompile'之后,Rails 4 资产未加载到 Heroku
无法在 heroku 上构建和部署 Rails 6.0.4.1 应用程序 - 引发 gyp verb cli 错误
应用程序错误:Heroku,Ruby on Rails 4,警告:rails_12factor,vendor / bundle,no Procfile