Was ist der Unterschied zwischen Servername _ und Servername "" in Nginx?

8

Ich möchte einen Standard-Catch-All-Serverblock festlegen, um alle Hostnamen zu verarbeiten, die nicht meinen genauen server_nameWerten entsprechen. Aber ich bin mir nicht sicher, welches ich verwenden soll.

server {
    listen 80 default_server;
    server_name ""; # this is by default if no server_name specified
    return 444;
}

oder

server {
    listen 80 default_server;
    server_name _;
    return 444;
}

Ich habe getestet und sie scheinen sich gleich zu verhalten. Gibt es einen Unterschied zwischen ihnen?

NARKOZ
quelle
1
Siehe diesen Link
Richard Smith

Antworten:

12

Kurze Antwort: Ja, es gibt einen Unterschied zwischen server_name "";undserver_name _;

Lange Antwort: Definiert server_name ""; eine Übereinstimmung für eine Anforderung ohne host Header seit 0.8.48 und wird seit 0.7.12 unterstützt.

https://nginx.org/en/docs/http/request_processing.html

Wenn Anforderungen ohne das Headerfeld "Host" nicht zulässig sein sollen, kann ein Server definiert werden, der nur die Anforderungen löscht:

server {
    listen      80;
    server_name "";
    return      444;
}

Hier wird der Servername auf eine leere Zeichenfolge gesetzt, die Anforderungen ohne das Headerfeld "Host" entspricht, und der nicht standardmäßige Code 444 eines speziellen Nginx wird zurückgegeben, der die Verbindung schließt.

Definiert auf der anderen Seite server_name _;einen ungültigen Servernamen, der sich nie mit einem echten Namen überschneidet. Es ist nur eine Nichtübereinstimmung. Falls keine Übereinstimmungen vorliegen, wählt nginx den ersten Serverblock {} aus und verwendet diesen.

server_name _;Abschließend können Sie für Catch-All-Server-Block verwenden, aber nicht server_name "";.

Referenz - /programming/9454764/nginx-server-name-wildcard-or-catch-all https://blog.gahooa.com/2013/08/21/nginx-how-to-specify -a-Standard-Server /

Pramod Singh
quelle
Beachten Sie, dass Sie zum Testen des Serverblocks HTTP 1.0( -0Parameter in curl) server_name ""verwenden müssen. curl -v -0 -H "Host:" http://localhost. Siehe die akzeptierte Antwort von serverfault.com/a/920459/485927
Rick
3
Ich frage mich, warum wir brauchen server_name _;Richtlinie , wenn wir listenmit default_server? Ist dies zu Informationszwecken?
Psylone