2015-12-12 14 views
5

Ich habe eine Rails App, die ich auf Heroku gebaut hatte und ich hatte es konfiguriert, SSL dort zu verwenden. Jetzt wechsle ich zu AWS EC2 und möchte, dass eine Version meiner App ohne SSL funktioniert. Sobald dies erledigt ist, werde ich die SSL-Funktionalität später hinzufügen.Rails: Warum leitet mein Server HTTP auf HTTPS

Mein Stack ist Puma + Nginx + PostgreSQL und ich arbeite mit Rails 4.2.4, Ruby 2.2.3 und Capistrano 3.4.0.

Ich erinnere mich, in meiner app, dass ich einmal die Linie

config.force_ssl = true 

in config/Umgebungen/production.rb eingefügt hatte. Ich habe dies auskommentiert und erwartet, dass meine App wieder gut mit http funktioniert. Aber selbst nach dem Kommentieren dieser Zeile wird die Anfrage bei jedem Besuch meiner öffentlichen EC2-IP (52.35.82.113) auf Port 80 (http) gesendet und auf Port 443 (https) umgeleitet.

Dies kann deutlich gesehen werden, wenn ich curl -v http://localhost auf meine EC2-Instanz führen Sie es zurück:

* Rebuilt URL to: http://localhost/ 
* Hostname was NOT found in DNS cache 
* Trying 127.0.0.1... 
* Connected to localhost (127.0.0.1) port 80 (#0) 
> GET/HTTP/1.1 
> User-Agent: curl/7.35.0 
> Host: localhost 
> Accept: */* 
> 
< HTTP/1.1 301 Moved Permanently 
* Server nginx/1.4.6 (Ubuntu) is not blacklisted 
< Server: nginx/1.4.6 (Ubuntu) 
< Date: Sat, 12 Dec 2015 12:22:56 GMT 
< Content-Type: text/html 
< Transfer-Encoding: chunked 
< Connection: keep-alive 
< Location: https://localhost/ 
< 
* Connection #0 to host localhost left intact 

Ich bin nicht sehr erfahren, wenn es um diese Dinge geht. Ich dachte anfangs, dass das Problem mit meiner Nginx-Konfiguration wäre, in meiner vorherigen Frage here wurde mir vorgeschlagen, dass nichts mit meiner Nginx-Konfiguration falsch war und dass die Weiterleitung von Rails kam. Ich vermute, dass dies der Fall ist, da ich in Nginx nichts sehen kann, was die Weiterleitung erzwingen könnte, aber wenn Sie denken, dass das Problem da sein könnte, dann können Sie eine Menge des relevanten Codes im obigen Link sehen.

Was sonst in Rails abgesehen von dem oben gedruckten force_ssl könnte die Umleitung verursachen?

Vielen Dank für Ihre Hilfe. Lassen Sie mich wissen, wenn Sie Fragen haben oder weitere Informationen benötigen!

+1

Ändern Ich denke, auf nginx Konfiguration Sie die Kraft ssl getan haben. – Emu

+0

Haben Sie Ihren Puma Server jemals neu gestartet? – Tobias

+0

Hallo @ Tobias. Ja, ich benutze 'ps', um die Prozess-ID zu finden und starte sie mit' kill -s SIGUSR2 ' – Dennis

Antwort

3

In Rails können Sie site-wide SSL mit einer Konfigurationsdatei erzwingen (wie Sie es getan haben) oder Sie können auswählen, welche Endpunkte SSL verwenden und die Klassenmethode force_ssl auf der Controller-Ebene verwenden.

Vielleicht haben Sie diese Methode auf Ihrem application_controller.rb oder welche Controller den Root-Pfad dient und vergaß es. Sie können einen exemple solchen Mechanismus innerhalb Rails-Dokumentation finden: http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html

force_ssl (options = {}) Link zu erzwingen die Anforderung an diesen speziellen Controller oder bestimmte Aktionen unter HTTPS-Protokoll sein.

Wenn Sie dies aus irgendeinem Grund (z. B. Entwicklung) deaktivieren müssen, dann können Sie verwenden eine: wenn oder: außer Bedingung.

class AccountsController < ApplicationController 
    force_ssl if: :ssl_configured? 

    def ssl_configured? 
    !Rails.env.development? 
    end 
end 
+0

Hallo @ alexandre-angelim, das ist ein wirklich guter Anruf, aber leider nein, es gibt nichts in meinem Anwendungs-Controller oder meinem "Haupt" -Controller, der den Root-Pfad bedient. Ich habe auch versucht, in meiner config/routes.rb zu suchen, aber es gibt dort nichts, das es entweder tun würde – Dennis

0

Ich habe versucht, bevor diese Zeile in Produktionsserver zu kommentieren und es änderte nichts so statt kommentieren nur wahr ändern falsch wie:

config.force_ssl = false 
+0

@Dennis: Haben Sie das versucht? –

+0

Hallo @marouenB, das war auch ein wirklich guter Ruf. Ich habe es versucht, aber es schien nichts zu ändern.Ich habe das Gefühl, dass mit meiner Konfiguration im Allgemeinen sehr viel falsch läuft, also konnte ich es nicht wirklich sagen. Danke für den Vorschlag – Dennis

2

This gist legt nahe, es könnte sein, weil eines HSTS-Headers:

Also, wenn Sie force_ssl einmal aktiviert haben, sogar [wenn] Sie den Config-Wert zu false später ändern, der Browser, den Sie zum Öffnen von y verwendet haben ou [r] App wird sich noch an diese Website erinnern (mit der zu identifizierenden Domain) [und] erfordert [Sie], HTTPS zu verwenden und leitet Sie automatisch zur HTTPS-Verbindung um.

Nach this page können Sie Ihre HSTS Einträge entfernen, indem Sie auf chrome://net-internals/#hsts in Chrome und about:permissions in Firefox zu gehen und ~/Library/Cookies/HSTS.plist in Safari zu löschen.

+1

Dies ist das genaue Problem, das ich hatte, und die Lösung für Chrome (pro Link; in Betracht ziehen, Ihre Antwort zu bearbeiten) soll zu chrome: // net-internals/# stests gehen und die Domäne löschen HSTS. –

+1

Ich habe einige Anweisungen zum Entfernen von HSTS-Einträgen hinzugefügt. – eremite

0

Ich hatte das gleiche Problem. Lösung für mich war:

  1. löschen config.force_ssl = true von aplication.rb
  2. Für ubuntu Strg + Umschalt + Entf => Private Daten löschen
0

erlebte ich dieses Problem auch (Schienen + Puma + Nginx). Jede redirect_to wurde an https gesendet, auch wenn sie von http kommt.

Im vhost.conf gab es diese Zeile:

proxy_set_header X-Forwarded-Proto https; 

redirect_to arbeitete richtig danach zu

proxy_set_header X-Forwarded-Proto http; 
Verwandte Themen