Heroku,Rails 4和Rack :: Cors

Jas*_*son 18 heroku cors ruby-on-rails-4

我正在尝试将Rack :: Cors与我的Rails 4应用程序一起使用,以便我可以执行基于JSON的API.

CORS在我的Gemfile中是这样的:

gem 'rack-cors', :require => 'rack/cors'
Run Code Online (Sandbox Code Playgroud)

我正在我的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
Run Code Online (Sandbox Code Playgroud)

我插入后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'
Run Code Online (Sandbox Code Playgroud)

当我在本地计算机上运行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
Run Code Online (Sandbox Code Playgroud)

我确实找到了这个问题(不能让机架在rails应用程序中工作),但没有提供任何有用的答案.

更新11/13/2013 16:40 EST

我一直在尝试对正在发生的事情进行更多的调试.我有猴子修补了一些Rack :: Cors的方法,看看他们是否甚至被称为Heroku.我也改变了将Cors插入机架中间件堆栈顶部的位置.

随着我的猴子修补我已经把puts文中陈述initialize,callallow方法.该initializeallow方法都被调用.call永远不会调用该方法.所以似乎有一些东西在它到达cors中间件之前就停止了请求.

dcu*_*001 14

我和heroku遇到了同样的问题.我发现这个博客有同样的机架问题.

刚搬进的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
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 4

看来问题是由我的机器或我所在的网络引起的。我通过 SSH 连接到我使用的托管环境,并使用上面的curl 命令,它起作用了。

附加说明 这是刚刚发生的其他事情,我认为我应该对此进行补充。我的 AJAX 请求不是针对我的 Heroku 应用程序的 https URL,但 Heroku 正在将其翻译为 https。这导致了额外的跨域问题。切换为对 AJAX 请求使用 https 解决了这个问题。