Ich habe hier ein wirklich seltsames Problem, bei dem jedes Mal, wenn ich versuche, meine Rails-App im Nicht-SSL-Modus zu durchsuchen, Chrome (v16) und Firefox (v7) meine Website dazu zwingen, in HTTPS bereitgestellt zu werden.
Meine Rails-Anwendung wird auf einem Ubuntu VPS unter Verwendung von Capistrano, Nginx, Passenger und einem Wildcard-SSL-Zertifikat bereitgestellt.
Ich habe diese Parameter für Port 80 in der Datei nginx.conf festgelegt:
passenger_set_cgi_param HTTP_X_FORWARDED_PROTO http;
passenger_set_cgi_param HTTPS off;
Die Langversion meiner nginx.conf finden Sie hier: https://gist.github.com/2eab42666c609b015bff
Die Datei ssl-redirect.include enthält:
rewrite ^/sign_up https://$host$request_uri? permanent ;
rewrite ^/login https://$host$request_uri? permanent ;
rewrite ^/settings/password https://$host$request_uri? permanent ;
Es soll sichergestellt werden, dass diese drei Seiten HTTPS verwenden, wenn sie von einer Nicht-SSL-Anforderung stammen.
Meine Datei Production.rb enthält folgende Zeile:
# Enable HTTP and HTTPS in parallel
config.middleware.insert_before Rack::Lock, Rack::SSL, :exclude => proc { |env| env['HTTPS'] != 'on' }
Ich habe versucht, über Nginx-Umschreibungen auf HTTP umzuleiten, Ruby on Rails umzuleiten und auch die URL der Rails-Ansicht mithilfe des HTTP-Protokolls verwendet.
Meine application.rb-Datei enthält die folgenden Methoden, die in einem before_filter-Hook verwendet werden:
def force_http
if Rails.env.production?
if request.ssl?
redirect_to :protocol => 'http', :status => :moved_permanently
end
end
end
Jedes Mal, wenn ich versuche, zu HTTP ohne SSL umzuleiten, versucht der Browser, es zurück zu HTTPS umzuleiten, was zu einer Endlosumleitungsschleife führt. Safari funktioniert jedoch einwandfrei. Selbst wenn ich das Bereitstellen von SSL in Nginx deaktiviert habe, versuchen die Browser immer noch, über HTTPS eine Verbindung zur Site herzustellen. Ich sollte auch erwähnen, dass die Rails-Umleitung für alle Browser einwandfrei funktioniert, wenn ich meine App auf Heroku weitergebe.
Der Grund, warum ich Nicht-SSL verwenden möchte, ist, dass meine Homepage nicht sichere dynamische eingebettete Objekte und ein nicht sicheres CDN enthält und ich Sicherheitswarnungen verhindern möchte.
Ich weiß nicht, warum der Browser weiterhin HTTPS-Anforderungen erzwingt.
/opt/nginx/conf/ssl-redirect.include
Antworten:
Wenn Sie
config.force_ssl = true
in Ihrer Umgebungskonfiguration verwendet und diese später deaktiviert haben, stellt Ihr Browser möglicherweise immer noch nur Verbindungen über SSL her.Rails sendet einen HSTS-Header, wenn dies der
force_ssl
Fall ist. Dies führt dazu, dass einige Browser nur Verbindungen über HTTPS zur betreffenden Domäne zulassen, unabhängig davon, was in der Adressleiste eingegeben wird. Diese Einstellung wird vom Browser standardmäßig 1 Jahr lang zwischengespeichert.In diesem Blogbeitrag finden Sie einige Tipps, wie Sie dies vermeiden können: http://www.simonecarletti.com/blog/2011/05/configuring-rails-3-https-ssl/#comment-40447
quelle
Ich habe einen Weg gefunden, HSTS aus einer Antwort in einem Wordpress-Supportforum ausgerechnet auszuschalten: https://wordpress.org/support/topic/want-to-turn-off-http-strict-transport-security-hsts -header # post-6068192
Sie können einen Header zurücksenden, der das HSTS-Caching deaktiviert. Getestet in Chrome mit diesem Beispiel before_filter in einer Rails 4-App:
quelle