Weiterleiten von Wildcard-Subdomains an https (nginx)

20

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?

was was
quelle
2
Warum nicht statt $ server_name $ host?
cjc

Antworten:

47

Das ist alles...

server {
    listen      80;
    server_name *.mydomain.com;

     #Rewrite all nonssl requests to ssl.
     return 301 https://$host$request_uri;
}
Cadmi
quelle
2
Ein bisschen mehr Erklärung könnte dies zu einer besseren Antwort machen.
Dave M
3
@dave-m, das muss da noch erklärt werden? $hostVariable? $request_uri?
Cadmi
Es funktioniert nicht, hat immer noch https: //%2A.handy.travel/
Damon Yuan
2

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

server {
listen      80;
server_name *.mydomain.com;

#Redirect all nonssl requests to ssl.
return 301 https://$server_name$request_uri;
}

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!

Apurva Sukant
quelle
Obwohl die Verwendung returnim 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 - $hostsollte anstelle von verwendet werden $server_name.
Maxim Dounin
Ja angenommen. Ah, meine Aufmerksamkeitsspanne scheint zu schwinden!
Apurva Sukant
Lassen Sie mich anstelle der obigen Einschränkung einen Tipp für Ihre SSL-Konfiguration geben, der die Leistung erheblich verbessern sollte. Die effizienteste Methode zum Einrichten von SSL bei Verwendung eines Platzhalterzertifikats ist das Einrichten der SSL-Heftung. Dadurch können Sie SSL auf Ihrem Standardserver für alle Unterdomänen einmal einrichten und für jede Unterdomäne eine separate SSL-Authentifizierung speichern. ssl_stapling on; Resolver 8.8.8.8; ssl_stapling_file /ssl_keys/example.com_staple; ssl_stapling_verify on; Referenz- calomel.org/nginx.html
Apurva Sukant
2
Sollte seinreturn 301 https://$host$request_uri;
scarver2
Ich warte auf die Ports 80, 8080 UND 8181 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
A.Grandt
-1

Versuchen Sie so etwas:

server {
  listen 80;
  server_name ~^(.*)\.mydomain\.com$;
  set $servername $1;
  rewrite ^(.*)$ https://$servername.mydomain.com/$1;
}

Der Haken ist, Platzhalter-Server zu definieren und Weiterleitungen basierend auf ihrem Namen durchzuführen.

Andrei Mikhaltsov
quelle
Übermäßig freizügige Regex-Gruppe.
Kzqai