Ich habe eine Anmeldeseite in einer Subdomain wie: https://signup.example.com
Es sollte nur über HTTPS zugänglich sein, aber ich fürchte, die Leute könnten irgendwie über HTTP darauf stoßen und eine 404 bekommen.
Mein HTML / Server-Block in Nginx sieht folgendermaßen aus:
html {
server {
listen 443;
server_name signup.example.com;
ssl on;
ssl_certificate /path/to/my/cert;
ssl_certificate_key /path/to/my/key;
ssl_session_timeout 30m;
location / {
root /path/to/my/rails/app/public;
index index.html;
passenger_enabled on;
}
}
}
Was kann ich hinzufügen, damit Personen, die weitergeleitet werden http://signup.example.com
, weitergeleitet werden https://signup.example.com
? (Zu Ihrer Information, ich weiß, dass es Rails-Plugins gibt, die erzwingen können, SSL
aber ich hatte gehofft, dies zu vermeiden.)
nginx
ssl
redirect
ruby-on-rails
Callmeed
quelle
quelle
Antworten:
Laut den Fallstricken von Nginx ist es etwas besser, die unnötige Erfassung wegzulassen und
$request_uri
stattdessen zu verwenden. Fügen Sie in diesem Fall ein Fragezeichen hinzu, um zu verhindern, dass Nginx Abfrageargs verdoppelt.quelle
return 301 http://domain.com$request_uri;
return 301...
einen Fehler "zu viele Umleitungen" verursacht, während die Umschreibemethode tatsächlich funktioniert.return 301
funktioniert, es sei denn (ich vermute), Sie lösen es auch für korrekte URLs aus, indem Sie beide Ports abhören (Beispiel für die Konfiguration, die das Problem auslöst: Nehmen Sie die erste Antwort von serverfault.com/a/474345/29689 und lassen Sie das if weg ).Der beste Weg, wie er im offiziellen How-to beschrieben wurde, ist die Verwendung der
return
Direktive:quelle
301 Moved Permanently
(Ihre Links wurden dauerhaft verschoben) sowie ein erneutes Schreibenproxy_set_header X-Forwarded-Proto https;
listen 443;
im selben Block?Dies ist die richtige und effizienteste Methode, wenn Sie alles in einem Serverblock speichern möchten:
Alles andere oben, mit "rewrite" oder "if ssl_protocol" usw., ist langsamer und schlimmer.
Dies ist das gleiche, aber noch effizienter, da nur das Umschreiben im http-Protokoll ausgeführt wird und nicht bei jeder Anforderung die Variable $ scheme überprüft werden muss. Aber im Ernst, es ist so eine Kleinigkeit, dass Sie sie nicht trennen müssen.
quelle
Wenn Sie die neue duale HTTP- und HTTPS-Serverdefinition verwenden, können Sie Folgendes verwenden:
Dies scheint für mich zu funktionieren und führt nicht zu Umleitungsschleifen.
Bearbeiten:
Ersetzt:
mit Pratiks Rewrite-Zeile.
quelle
If you are using the new dual HTTP and HTTPS server definition
dann solltest du es trennen.return 301 https://$server_name$request_uri;
da dies die bevorzugte Methode ist.Eine weitere Variante, die den Host: request-Header beibehält und dem "GOOD" -Beispiel für Nginx-Fallstricke folgt :
Hier sind die Ergebnisse. Beachten Sie, dass die Verwendung von
$server_name
anstelle von$host
immer zu umleiten würdehttps://site1
.quelle
Note that using $server_name instead of $host would always redirect to https://site1
ist das nicht was$request_uri
für?$request_uri
Enthält keinen Host- oder Domainnamen. Mit anderen Worten, es beginnt immer mit einem "/" Zeichen.Stellen Sie sicher, dass Sie für alle Cookies die Option "sicher" aktivieren, da sie sonst bei der HTTP-Anforderung gesendet werden und von einem Tool wie Firesheep abgerufen werden können.
quelle
Das funktioniert besser, denke ich. xxxx bezieht sich auf die IP Ihres Servers. Wenn Sie mit Plesk 12 arbeiten, können Sie dies tun, indem Sie die Datei "nginx.conf" im Verzeichnis "/var/www/vhosts/system/domain.tld/conf" für die gewünschte Domain ändern. Vergessen Sie nicht, den Nginx-Dienst neu zu starten, nachdem Sie die Konfiguration gespeichert haben.
quelle
rewrite ^ https://$host$request_uri? permanent;
wäre eine bessere lösung, da sie mehrere servernamen auf einem vhost haben könntenIch denke, das ist die einfachste Lösung. Erzwingt sowohl Nicht-HTTPS- als auch Nicht-WWW-Datenverkehr nur zu HTTPS und WWW.
EDIT - Apr 2018: Lösung ohne IFs finden Sie in meinem Beitrag hier: https://stackoverflow.com/a/36777526/6076984
quelle