Ich habe eine Wildcard-SSL-Zertifizierung und versuche, den gesamten Nicht-SSL-Verkehr auf SSL umzuleiten. Zur Zeit verwende ich die folgende URL für die Weiterleitung der nicht-subdominierten URL, die einwandfrei funktioniert.
server {
listen 80;
server_name mydomain.com;
#Rewrite all nonssl requests to ssl.
rewrite ^ https://$server_name$request_uri? permanent;
}
Wenn ich dasselbe für * .mydomain.com mache, leitet es logischerweise weiter zu
https://%2A.mydomain.com/
Wie leiten Sie alle Subdomains zu ihrem https-Äquivalent um?
Antworten:
Das ist alles...
quelle
$host
Variable?$request_uri
?In der offiziellen NGINX-Dokumentation wird empfohlen, die return-Direktive anstelle der rewrite-Direktive für die Umleitung zu verwenden. Dies ist der Fall, da die neu geschriebene Anforderung nicht für diesen Server bestimmt ist, aber dennoch in diesem Serverblock verarbeitet wird. Umleitungen werden stattdessen korrekt mit einer return-Direktive ausgeführt, da die gesamte Verarbeitung gestoppt und eine Antwort sofort gesendet wird. NGINX rät vom Umschreiben zur Weiterleitung hier ab: http://nginx.org/en/docs/http/converting_rewrite_rules.html
Die Syntax für die Rückgabeanweisung lautet: Rückgabecode-URL; Da Sie ursprünglich ein permanentes Umschreiben durchgeführt haben, können Sie 301 als Code für die Antwort verwenden, um anzuzeigen, dass es sich um eine permanente Umleitung handelt. Ihre https-Adresse wird im URL-Bereich weitergegeben. Referenz: http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return
Also wäre deine richtige Konfiguration
Auf diese Weise können Sie wahrscheinlich mit einem Platzhalter-Serverblock ordnungsgemäß zu Ihrer SSL-Domain umleiten. Sie können auch den generischen Servernamen '_' oder $ host als Unterstrich verwenden, wie im obigen Kommentar vorgeschlagen. Lass uns wissen!
quelle
return
im Allgemeinen besser ist, ist die vorgeschlagene Konfiguration nicht korrekt, da weiterhin $ server_name für die Umleitung verwendet wird, also "* .meinedomäne.com". Der korrekte Fix wurde bereits von @cjc im obigen Kommentar umrissen -$host
sollte anstelle von verwendet werden$server_name
.return 301 https://$host$request_uri;
return 301 https://$server_name$request_uri;
, damit sie https auf Port 443 verwenden. Das Problem ist, dass die umgeleitete URL immer noch die ursprüngliche Portnummer hat. 80 ist kein Problem, aber 8080 erscheint alshttps://example.com:8080
Versuchen Sie so etwas:
Der Haken ist, Platzhalter-Server zu definieren und Weiterleitungen basierend auf ihrem Namen durchzuführen.
quelle