1

Ich bin derzeit ein paar Rails 3.2.x-Anwendungen laufen. Der eine, der Ruby 1.9.x verwendet und der api-Endpunkt ist, hat Rack-cors gem (1.0.1) - Alice; der andere läuft auf swagger-ui_rails gem und ist die App, die die API-Dokumentation hostet - App Bob. Die Swagger-Dokumentation wurde mit dem Swagger-Docs-Juwel erstellt, das die Formatversion 1.2 ausführt. Aus irgendeinem Grund oder einem anderen, kann ich App Alice mich nicht für Bob Informationen zu geben, weil dieser Fehler:Rack-cors zeigt keine Header in der Produktion env für 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. 

jedoch! Wenn ich auf die Registerkarte Netzwerk schaue, ist die Antwort eine 200 und ich kann die JSON Informationen sehen. Aber die Antwort-Header haben definitiv nicht die erforderliche Access-Control-Allow-Origin Header.

Dies geschieht sowohl durch AWS Elastic Beanstalk (Bob ist auf EBS gehostet) und lokal (mit einer gebundenen Adresse).

In meinem config/environments/production.rb von Alice, ich habe folgendes:

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 

Als ich in config/environments/development.rb in Alice diesen Code haben, localhost eine Verbindung herstellt und Prahlerei-ui zeigt sich als ohne Fehler in der Konsole erwartet.

auf der Registerkarte Netzwerk von Chrome, ist das, was ich vor Ort haben (Bob und Alice in 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 

Das ist, was ich bekommen, wenn Bob ist in dev und Alice ist in 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: 

Wie Sie sehen können, prod-Alice kehrt nicht jede Art von Header den Weg dev-Alice tut, auch mit dem exakt gleichen Rack Cors Codeblock.

rake middleware zeigt Rack :: Cors an der Spitze des Stapels und curl -i https://alice.example.com/api-docs/v1/api-docs.json hat nie die richtigen Access-Control-Header für mich, sowohl lokal als auch auf Bobs Server zurückgegeben.

prod-Bob hat auch einige EBS-Erweiterungen, um einige Anforderungsheader und Methoden zu nginx hinzuzufügen. In einigen anderen SO-Posts sah ich Leute, die Antwort-Header direkt über Rails hinzufügen, und so hat Bob auch folgende in application_controller.rb (und in dev, mit binding.pry, kann ich bestätigen, dass die Antwort definitiv die angegebenen Header hat)

Ich bin ein wenig ratlos und jede Hilfe oder Gedanken würde geschätzt werden.

Antwort

1

Das Swagger-Docs-Juwel, das ich verwende, setzt die .json-Dateien, die ich erstellt habe, in das Verzeichnis /public von Rails. Daher sieht Rails dies als statische Dateien und nicht als etwas, das Rack-Middleware durchlaufen sollte. Da unsere production.rb-Datei config.serve_static_assets = false hatte, bedeutete das, dass all diese statischen Dateien in der Verantwortung unseres Web-Servers (Apache/Nginx) lagen und nicht die Verantwortung von Rack-Cors Gem.

Nach dem Hinzufügen einiger CORS-Header zu Apache, Swagger-Ui ordnungsgemäß geladen, aber verdoppelte die Header - 1. für Apache, 2. für Rack-Cors.

Ich habe seit entfernt Rack-cors Juwel und haben den Apache-Server conf Einstellung auf Alice eingestellt, basierend auf einem SO zu Wildcard Sub-Domains bezogen Antwort:

/etc/apache2/sites-enabled/mysite.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" 
Verwandte Themen