Nginx: Vermeidung der doppelten Warnung von Servername

573
Chaos_99

Ich biete eine Website von Nginx an, die sowohl mit internen Hostnamen als auch mit externen Namen verfügbar ist. Ich möchte den externen Zugriff zur Verwendung von https erzwingen, aber http für den internen Zugriff beibehalten (da ich keine Zertifikate für diese internen Adressen erhalten kann).

Die folgende Konfiguration macht was ich will:

#redirect port 80 http to 443 https server{ listen 80 default_server; listen [::]:80 default_server; #just for external access server_name hostname.external_domain; return 301 https://$host$request_uri; }  # serve both http and https internally server { listen 80; listen 443 ssl; listen [::]:80; listen [::]:443 ssl;  server_name hostname hostname.internal_domain hostname.external_domain;  ... 

aber nginx -tgibt mir die Warnung

nginx: [warn] conflicting server name "hostname.external_domain" on 0.0.0.0:80, ignored 

weil dieser Hostname in beiden Serverdefinitionen verwendet wird. Aber es muss da sein, oder ich kann den http-Zugriffsversuch nicht einfangen oder den umgeleiteten.

Ich weiß, ich könnte eine dritte Serverdefinition mit nur Port 443 und ohne Port 80 hinzufügen hostname.external_domainund nur diesen Namen vom zweiten Server entfernen. Dies würde wahrscheinlich die Warnung entfernen, aber ich musste den gesamten Inhalt des Serverblocks kopieren auch, was ich irgendwie überflüssig finde.

Gibt es eine bessere Lösung?

2

1 Antwort auf die Frage

1
Richard Smith

Option 1.

Verwenden Sie drei serverBlöcke (wie in Ihrer Frage erwähnt), lagern Sie den duplizierten Inhalt jedoch in eine separate Datei und verwenden Sie eine includeDirektive, um ihn in jeden der relevanten serverBlöcke zu ziehen . Einzelheiten finden Sie in diesem Dokument .


Option 2.

Das default_serverbraucht keine server_nameAussage. Sie sollten default_serverjedoch den anderen serverBlock austauschen, so dass der 1. serverBlock der spezifischere wird.

Zum Beispiel:

server{ listen 80; listen [::]:80; server_name hostname.external_domain; return 301 https://$host$request_uri; }  server { listen 80 default_server; listen 443 ssl default_server; listen [::]:80 default_server; listen [::]:443 ssl default_server;  ... } 

Der zweite server_blockmuss nicht mit einem übereinstimmen, server_nameda er mit allem übereinstimmt, für den der erste serverBlock nicht explizit passt.