![NGINX: localhost leitet um zu _](https://rvso.com/image/782624/NGINX%3A%20localhost%20leitet%20um%20zu%20_.png)
nginx Version/1.18.0 (Ubuntu) – Ubuntu 22.04.01 LTS x86_64 Kernel 6.0.8
Ich habe einen Server (Installationsspezifikationen oben), der mehrere Hostnamen hat, auf dem Nginx läuft und auf dem alles funktioniert (einschließlich Nginx, mit Weiterleitungen von http: auf https:).
So mache ich das auf meinem Standardserver:
listen 80 default_server;
listen 443 default_server ssl;
# force https-redirects
if ($scheme = http) {
return 301 https://$host$request_uri;
}
server_name _;
Hier ist das seltsame Verhalten:
URL | Weiterleitungen zu | Anmerkungen |
---|---|---|
http://mumblefrotz/ |
https://mumblefrotz/ |
(funktioniert wie erwartet) |
http://mumblefrotz.fullyqualified.com/ |
https://mumblefrotz.fullyqualified.com/ |
(funktioniert wie erwartet) |
http://127.0.0.1/ |
https://127.0.0.1/ |
(funktioniert wie erwartet) |
http://localhost/ |
https://_ |
VERSAGEN |
Warum macht es das? Ich vermute, es hat etwas damit zu tun,server_name
-Direktive wörtlich genommen wird, obwohl ich nicht ganz sicher bin, warum dies nur bei passiert localhost
.
Beim Betrachtendieser Stack Overflow-Vorschlag, ich habe beides der folgenden versucht und trotzdem den überraschenden Unterstrich erhalten:
server_name ~.;
server_name ~^(.+)$;
Meine Erwartung ist, $host
dassder in der HTTP-Anforderung übergebene Hostname, wobei ein virtueller Host es aufnimmt, wenn einer definiert wurde, und andernfalls auf die Standardserverdefinition zurückgreift.
Soweit ich weiß, http://localhost/
ist dies das einzige Problem, das nicht richtig aufgelöst wird. Das möchte ich beheben.
Antwort1
Es gab keine Informationen zu der Frage, welcher Client für die Anfrage verwendet wurde. Wie inNginx-Dokumentation, $host
Variable enthält:
in dieser Reihenfolge: Hostname aus der Anforderungszeile oder Hostname aus dem Anforderungsheaderfeld „Host“ oder der Servername, der einer Anforderung entspricht
„Anforderungszeile“ bedeutet hier den Hostnamen nach GET
dem Verb in der HTTP-Anforderung.
Das zweite ist das Host
Header-Feld.
Der dritte Begriff bezeichnet den in konfigurierten Namen server_name
.
In Ihrem Fall denke ich, dass der Testclient eine Anfrage gestellt hat, die keinen Host
Header enthielt. Daher hat Nginx die server_name
Konfiguration für den Inhalt der $host
Variablen verwendet.
Persönlich generiere ich einfach den HTTP -> HTTPS-Weiterleitungsblock für jeden virtuellen Server, da ich Nginx-Konfigurationen mit Ansible verwalte. Auf diese Weise kann ich einen return 404
virtuellen Host für alle anderen Hostnamen haben, an denen ich nicht interessiert bin.
Wenn Sie jedoch einen gemeinsamen virtuellen Host für die Weiterleitungen implementieren müssen, können Sie den folgenden Ansatz verwenden:
map $http_host $redirect_host {
~ (^.+$) $http_host;
default example.com;
}
server {
listen 80 default_server;
...
if ($scheme = http) {
return 301 https://$redirect_host$request_uri;
}
}
Dabei wird immer der HTTP-Hostheader als Umleitungsziel verwendet, außer wenn kein Host
Header vorhanden ist. In diesem Fall wird er example.com
als Umleitungsziel verwendet. Sie können beispielsweise Ihren Hauptdomänennamen als Umleitungsziel zuweisen.