現在、Rails 3.2.xのいくつかのアプリケーションを実行しています。 Ruby 1.9.xを使用し、apiエンドポイントにはRice-cors gem(1.0.1) - app Aliceがあります。もう一つはswagger-ui_rails gemを実行し、api documentation - app Bobをホストしているアプリです。スワッガードキュメントは、swagger-docs gemで作成されました。これは、フォーマットバージョン1.2を実行します。何らかの理由または別のために、私はこのエラーのためのアプリアリスは私のボブのための情報を提供するために取得することはできません。swagger-ui_rails用の生産ラインでヘッダーが表示されていないラックコック
Failed to load https://alice.example.com/api-docs/v1/api-docs.json:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://bob.example.com:3000' is therefore not allowed access.
しかし!私がネットワークタブを見ると、応答は200で、私はjsonの情報を見ることができます。しかし、応答ヘッダーには、必然的に必要なヘッダーがありません。Access-Control-Allow-Origin
ヘッダー
これは、AWS Elastic Beanstalk(BobはEBSでホストされます)とローカル(バインドされたアドレス)の両方で発生します。アリスの私のconfig/environments/production.rb
で
、私は次のようにあります
config.middleware.insert_before 0, 'Rack::Cors' do
allow do
origins ->(origin, env) do
Rails.logger.warn("CORS origin: #{origin}")
origin =~ /\.example\.com(:\d+)?\z/
end
resource('*', :methods => [:get, :post, :options], :headers => :any)
end
end
私はアリスでconfig/environments/development.rb
にこのコードを持っている場合は、コンソールでエラーなしで期待通りに、ローカルホスト接続および闊歩-UIが表示されます。クロームのネットワークタブで
、これは私がローカルに持っているもの(DEV/localhostのボブとアリス)である
Access-Control-Allow-Methods:GET, POST, OPTIONS
Access-Control-Allow-Origin:http://apitest.bob.com:3000
Access-Control-Expose-Headers:
Access-Control-Max-Age:1728000
Content-Length:1499
Content-Type:application/json
Date:Fri, 22 Sep 2017 21:44:45 GMT
Last-Modified:Mon, 28 Aug 2017 17:37:22 GMT
Server:
Vary:Origin
これはボブがDEVにあり、アリスがPRODのときに私が得るものです:あなたが見ることができるように
Accept-Ranges:bytes
Connection:keep-alive
Content-Length:1500
Content-Type:application/json
Date:Fri, 22 Sep 2017 23:10:00 GMT
ETag:"abc-559ce64fb8374"
Last-Modified:Fri, 22 Sep 2017 22:04:35 GMT
Server:
は、PROD-アリスでもまったく同じラックCORSのコードブロックで、ヘッダの任意の並べ替えにDEV-アリスが行う方法を返しません。
rake middleware
は、スタックの一番上にRack :: Corsを表示し、curl -i https://alice.example.com/api-docs/v1/api-docs.json
はローカルとボブのサーバーの両方で適切なアクセス制御ヘッダーを返すことはありません。
prod-Bobには、いくつかのリクエストヘッダーとメソッドをnginxに追加するEBS拡張機能もあります。他のSOの投稿では、Rails経由で直接レスポンスヘッダを追加するのを見たので、Bobはapplication_controller.rb
に次のような内容を書いています(bind.pryで、応答が確実に指定されたヘッダを持つことを確認できます)
after_filter :set_access_control_headers
def set_access_control_headers
headers['Access-Control-Allow-Origin'] = Rails.configuration.hostnames['headers']
headers['Access-Control-Request-Methods'] = 'GET, PUT, POST, OPTIONS'
end
私は少し迷っています。助けや考えがあれば分かります。