NGINX: localhost leitet um zu _

NGINX: localhost leitet um zu _

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, $hostdassder 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, $hostVariable 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 GETdem Verb in der HTTP-Anforderung.

Das zweite ist das HostHeader-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 HostHeader enthielt. Daher hat Nginx die server_nameKonfiguration für den Inhalt der $hostVariablen 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 404virtuellen 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 HostHeader vorhanden ist. In diesem Fall wird er example.comals Umleitungsziel verwendet. Sie können beispielsweise Ihren Hauptdomänennamen als Umleitungsziel zuweisen.

verwandte Informationen