19

Rails 4 アプリケーションで Rack::Cors を使用して、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デバッグ情報を取得しようとしてafter を挿入しています。

私はそれをテストするために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。メソッドとメソッドの両方が呼び出されます。メソッドが呼び出されることはありません。そのため、cors ミドルウェアに到達する前にリクエストを停止しているものがあるようです。initializecallallowinitializeallowcall

4

6 に答える 6

15

私はherokuで同じ問題に遭遇しました。同じラックコアの問題でこのブログを見つけました。

をに移動しuse Rack::Corsconfig.ruheroku に再デプロイしただけで動作します。

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:22:15.700 に答える
4

この問題は、自分のマシンまたは使用しているネットワークが原因で発生しているようです。使用しているホスティング環境に SSH で接続し、上記の curl コマンドを使用したところ、機能しました。

追加の注意 ここに、これに追加する必要があると私が思った別の出来事があります。私の AJAX リクエストは、Heroku アプリの https URL に対するものではありませんでしたが、Heroku はそれを https に変換していました。これにより、別のクロスオリジンの問題が発生していました。AJAX リクエストに https を使用するように切り替えると、これが修正されました。

于 2013-12-09T19:14:18.780 に答える
1

私は同様の問題を抱えていました.chromeの開発ツールで見ることができたとしても、angularjsの応答からLocationヘッダーを読み取ることができませんでした. 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
于 2014-11-09T11:34:00.357 に答える