Ich möchte alle http-Anfragen auf meinem Webserver in https-Anfragen umschreiben. Ich habe mit Folgendem begonnen:
Server { höre 80; Standort / { umschreiben ^ (. *) https: //meinesite.com$1 permanent; } ...
Ein Problem ist, dass hierdurch alle Subdomain-Informationen entfernt werden (z. B. node1.mysite.com/folder). Wie kann ich die obigen Informationen neu schreiben, um alles zu https umzuleiten und die Subdomain zu verwalten?
Antworten:
Richtiger Weg in neuen Versionen von Nginx
Entpuppen meine erste Antwort auf diese Frage zu bestimmten Zeit korrekt war, aber es stellte sich in eine andere Gefahr - zu bleiben auf dem neuesten Stand überprüfen Sie bitte Taxing Tücken umschreiben
Ich wurde von vielen SE-Benutzern korrigiert, daher geht das Guthaben an sie, aber was noch wichtiger ist, hier ist der richtige Code:
quelle
$host
anstelle von$server_name
Subdomains verwenden müssen.HINWEIS: Der beste Weg, dies zu tun, wurde von https://serverfault.com/a/401632/3641 bereitgestellt - wird jedoch hier wiederholt:
Im einfachsten Fall wird Ihr Host als Ihr Dienst festgelegt, an den Sie ihn senden möchten. Dies führt eine 301-Weiterleitung zum Browser durch und die Browser-URL wird entsprechend aktualisiert.
Unten ist die vorherige Antwort, die aufgrund von Regex ineffizient ist. Eine einfache 301 ist großartig, wie @kmindi zeigt
Ich habe Nginx 0.8.39 und höher verwendet und Folgendes verwendet:
Sendet eine permanente Weiterleitung an den Client.
quelle
Ich denke, der beste und einzige Weg sollte sein, eine dauerhafte Umleitung mit HTTP 301 Moved wie folgt zu verwenden:
Die permanente Umleitung von HTTP 301 Moved ist auch die effizienteste, da laut bereits erwähnten Pitfails kein regulärer Ausdruck ausgewertet werden muss .
Das neue HTTP 308 Moved behält die Request-Methode dauerhaft bei und wird von den gängigen Browsern unterstützt . Zum Beispiel mit
308
Browser aus von Ändern der Anforderungsmethode verhindert ,POST
umGET
die Umleitungsanforderung.Wenn Sie den Hostnamen und die Unterdomäne beibehalten möchten, ist dies der richtige Weg.
Dies funktioniert immer noch, wenn Sie kein DNS haben , da ich es auch lokal verwende. Ich fordere zum Beispiel mit an
http://192.168.0.100/index.php
und werde auf genau umgeleitethttps://192.168.0.100/index.php
.Ich verwende
listen [::]:80
auf meinem Host, weil ich aufbindv6only
festgelegt habefalse
, so bindet es auch an IPv4-Socket. Ändern Sielisten 80
die Einstellung in, wenn Sie IPv6 nicht oder nicht an eine andere Stelle binden möchten.Die Lösung von Saif Bechan verwendet das,
server_name
was in meinem Fall localhost ist, aber nicht über ein Netzwerk erreichbar ist.Die Lösung von Michael Neale ist gut, aber laut den Pitfails gibt es eine bessere Lösung mit Redirect 301;)
quelle
Innerhalb des Server-Blocks können Sie auch Folgendes tun:
quelle
Das oben Genannte hat nicht funktioniert, da ständig neue Subdomains erstellt wurden. zB AAA.example.com BBB.example.com für ca. 30 Subdomains.
Endlich habe ich eine Konfiguration, die mit folgendem funktioniert:
quelle
301 https://*/
die Anfrage in den anderen Antworten hier entweder zurückgeben oder vorzeitig stornieren.server_name _;
mit$host
war die Antwort, die den Trick tat. +1_
die eigentliche Domain zu ersetzen , z. B..domain.com
ich hatte zwei Server, und nginx leitete versehentlich einen meiner Server an den Standardserver.Ich habe vor langer, langer Zeit einen Kommentar zur richtigen Antwort mit einer sehr wichtigen Korrektur gepostet, aber ich halte es für notwendig, diese Korrektur in seiner eigenen Antwort hervorzuheben. Keine der vorherigen Antworten kann sicher verwendet werden, wenn Sie zu irgendeinem Zeitpunkt unsicheres HTTP eingerichtet haben und Benutzerinhalte erwarten, Formulare haben, eine API hosten oder eine Website, ein Tool, eine Anwendung oder ein Dienstprogramm konfiguriert haben, um mit Ihrer Site zu sprechen.
Das Problem tritt auf, wenn eine
POST
Anfrage an Ihren Server gestellt wird. Wenn der Server mit einer einfachen30x
Weiterleitung antwortet, geht der POST-Inhalt verloren. Was passiert , ist , dass der Browser / Client die Anforderung an SSL - Upgrade aber Herabstufung derPOST
auf eineGET
Anfrage. DiePOST
Parameter gehen verloren und es wird eine falsche Anfrage an Ihren Server gesendet.Die Lösung ist einfach. Sie müssen eine
HTTP 1.1 307
Umleitung verwenden. Dies ist in RFC 7231 S6.4.7 beschrieben:Die von der akzeptierten Lösung angepasste Lösung wird
307
in Ihrem Weiterleitungscode verwendet:quelle
Ich habe es so geschafft:
https://stackoverflow.com/a/36777526/6076984
quelle
Ich starte ngnix hinter einer AWS ELB. Die ELB spricht über http mit ngnix. Da die ELB keine Möglichkeit hat, Weiterleitungen an Clients zu senden, überprüfe ich den X-Forwarded-Proto-Header und leite ihn weiter:
quelle
Wenn Sie
return 301 https://$host$request_uri;
die Standardantwort auf Port 80 sind, kann es sein, dass Ihr Server früher oder später eine Liste offener Proxys [1] erhält und missbraucht wird, um Datenverkehr an eine andere Stelle im Internet zu senden. Wenn sich Ihre Protokolle mit Nachrichten wie dieser füllen, wissen Sie, dass es Ihnen passiert ist:Das Problem ist, dass
$host
alles, was der Browser imHost
Header oder sogar im Hostnamen aus der Eröffnungszeile von HTTP sendet , wie folgt wiedergegeben wird:Aufgrund dieses Problems empfehlen einige andere Antworten hier die Verwendung von
$server_name
anstelle von$host
.$server_name
Wertet immer so aus, wie Sie es in derserver_name
Erklärung angegeben haben. Wenn Sie jedoch mehrere Subdomains haben oder einen Platzhalter verwenden, funktioniert dies nicht, da$server_name
nur der erste Eintrag nach derserver_name
Deklaration verwendet wird und vor allem nur ein Platzhalter zurückgegeben wird (nicht erweitert).Wie kann man also mehrere Domänen unterstützen und gleichzeitig die Sicherheit gewährleisten? Auf meinen eigenen Systemen habe ich dieses Dilemma gelöst, indem ich zuerst einen
default_server
Block aufgelistet habe, der nicht verwendet wird$host
, und dann einen Platzhalterblock aufgeführt habe, der Folgendes bewirkt:(Sie können auch mehr als eine Domain im zweiten Block angeben.)
Bei dieser Kombination werden nicht zugeordnete Domains (immer
example.com
) an einen festen Ort umgeleitet , und Domains, die mit Ihren eigenen übereinstimmen, werden an die richtige Stelle verschoben . Ihr Server ist nicht als offener Proxy geeignet, sodass Sie keine Probleme haben.Wenn Sie sich feurig fühlen, können Sie wahrscheinlich auch dafür sorgen, dass der
default_server
Block keiner Ihrer legitimen Domänen entspricht, und etwas Anstößiges anrichten. . . .[1] Technisch gesehen ist "Proxy" das falsche Wort, da Ihr Server nicht ausfällt und Anforderungen für die Clients erfüllt, sondern nur eine Umleitung sendet, aber ich bin mir nicht sicher, was das richtige Wort wäre. Ich bin mir auch nicht sicher, was das Ziel ist, aber es füllt Ihre Protokolle mit Lärm und verbraucht Ihre CPU und Bandbreite, so dass Sie es genauso gut verhindern können.
quelle
Es sieht so aus, als hätte niemand wirklich 100% richtig verstanden. Damit Port 80-Anforderungen für einen gesamten Webserver an ihre 443-Entsprechungen gesendet werden, müssen Sie die listen- Direktive verwenden, nicht die server_name-Direktive, um den Catch-All- Namen anzugeben . Siehe auch https://nginx.org/en/docs/http/request_processing.html
Und stellen Sie sicher, dass Sie überprüfen, was bereits in /etc/nginx/conf.d/ enthalten ist, da ich häufig Probleme hatte, bei denen die default.conf einen vorhandenen vhost zurückgab. Meine Arbeit mit Nginx-Problemen beginnt immer damit, dass ich die Standarddatei herausnehme und sie zeilenweise wieder auskommentiere, um festzustellen, wo es schief geht.
quelle
quelle