1

現在、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 

私は少し迷っています。助けや考えがあれば分かります。

答えて

1

私が使用しているSwagger-docsの宝石は、作成した.jsonのファイルをRailsの/publicディレクトリに置きます。そのため、Railsはこれを静的ファイルと見なし、Rackミドルウェアを経由する必要はありません。 production.rbファイルにはconfig.serve_static_assets = falseが含まれていたため、これらのすべての静的ファイルは、Webサーバー(Apache/Nginx)の責任であり、ラック・コーラー・ジェムの責任ではありませんでした。

いくつかのCORSヘッダーをApacheに追加した後、swagger-uiは適切にロードされましたが、ヘッダーが倍増していました - Apacheは1番目、ラックは2番目です。

私は削除され、ラックCORSの宝石以来きたし、SOワイルドカードのサブドメインに関連する回答に基づいてアリスに設定Apacheサーバconfに、調整しています

は/ etc/apache2の/サイト対応/個人用サイトを。conf

SetEnvIf Origin ^(https?://.+\.example\.com(?::\d{1,5})?)$ CORS_ALLOW_ORIGIN=$1 
Header append Access-Control-Allow-Origin %{CORS_ALLOW_ORIGIN}e env=CORS_ALLOW_ORIGIN 
Header merge Vary "Origin" 
Header set "Access-Control-Allow-Methods" "GET, POST, OPTIONS" 
関連する問題