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