Wie ändere ich den von nginx zurückgegebenen Server-Header?

141

Es gibt eine Option zum Ausblenden der Version, sodass nur Nginx angezeigt wird. Gibt es jedoch auch eine Möglichkeit, diese auszublenden, damit nichts angezeigt oder der Header geändert wird?

Daniels
quelle
34
Übrigens, um die Nginx-Version auszublenden, müssen Sie 'server_tokens off' setzen.
Yanchenko
2
Wenn Sie Nginx aus dem Header entfernen möchten, möchten Sie es möglicherweise auch aus Weiterleitungen und Fehlerseiten entfernen.
Fabianegli

Antworten:

57

Wie bei Apache ist dies eine schnelle Bearbeitung der Quelle und Neukompilierung. Von Calomel.org :

Die Server: Zeichenfolge ist der Header, der an den Client zurückgesendet wird, um ihm mitzuteilen, welchen http-Servertyp Sie ausführen und möglicherweise welche Version. Diese Zeichenfolge wird von Orten wie Alexia und Netcraft verwendet, um Statistiken darüber zu sammeln, wie viele und welche Arten von Webservern im Internet aktiv sind. Um den Autor und die Statistiken für Nginx zu unterstützen, empfehlen wir, diese Zeichenfolge unverändert zu lassen. Aus Sicherheitsgründen möchten Sie möglicherweise nicht, dass die Benutzer wissen, was Sie ausführen, und Sie können dies im Quellcode ändern. Bearbeiten Sie die Quelldatei src/http/ngx_http_header_filter_module.c in den Zeilen 48 und 49. Sie können den String nach Belieben ändern.

## vi src/http/ngx_http_header_filter_module.c (lines 48 and 49)
static char ngx_http_server_string[] = "Server: MyDomain.com" CRLF;
static char ngx_http_server_full_string[] = "Server: MyDomain.com" CRLF;

Bearbeiten im März 2011: Wir bitten Flavius ​​unten, auf eine neue Option hinzuweisen, die das Standard- HttpHeadersModule von Nginx durch das gegabelte HttpHeadersMoreModule ersetzt . Das Neukompilieren des Standardmoduls ist immer noch die schnelle Lösung und sinnvoll, wenn Sie das Standardmodul verwenden möchten und die Serverzeichenfolge nicht häufig ändern. Wenn Sie jedoch mehr als das wollen, ist das HttpHeadersMoreModule ein starkes Projekt, mit dem Sie mit Ihren HTTP-Headern alle Arten von schwarzer Laufzeitmagie ausführen können.

joelhardi
quelle
18
using 'server_tokens off;' ist bei weitem der einfachste Weg, dies zu tun ... stellen Sie sicher, dass Sie es in einem "http" - oder "Server" -Block
ablegen
35
Das verbirgt die Versionsnummer, aber die Frage war: "Ich weiß, dass ich die Versionsnummer ausblenden kann. Wie ändere oder lösche ich die gesamte 'Server'-Zeichenfolge?" Mit Out-of-the-Box-Nginx ist dies nicht möglich.
Joelhardi
Eine weitere schnelle Lösung (für Version 1.7.8) zum vollständigen Entfernen des Server-Headers lautet: Kommentieren Sie die Zeilen 49 und 50 (entsprechend den obigen Zeilen 48, 49), 280-283 und 458-469 aus. Zum späteren Nachschlagen: Die letzten beiden sind beide if-Blöcke, die gesetzt werden r->headers_out.server.
Pauluss86
3
Diese Antwort ist jetzt ein wenig aber alt. Die Antwort von @jamescampbell ist jetzt genauer.
jmcollin92
Wenn Sie diese Methode zum Maskieren Ihres Servers verwenden möchten, können Sie auch die Datei src / http / ngx_http_special_response.c bearbeiten, um die Fehlermeldungen des Servers zu ändern.
Brogan
143

Wenn Sie nginx zum Proxy einer Back-End-Anwendung verwenden und möchten, dass das Back-End seinen eigenen Server:Header ankündigt, ohne dass nginx ihn überschreibt, können Sie in Ihre server {…}Zeilengruppe gehen und Folgendes festlegen:

proxy_pass_header Server;

Das wird nginx davon überzeugen, diesen Header in Ruhe zu lassen und den vom Back-End festgelegten Wert nicht neu zu schreiben.

Brandon Rhodes
quelle
11
Wenn Sie diese Änderung aus Sicherheitsgründen vornehmen, bin ich mir nicht sicher, ob dies ausreicht. Wenn Ihr Server eine Fehlermeldung zurückgeben muss, lautet der Header weiterhin 'nginx'
KC Baltz
10
Dies löst das Problem zwar leicht, es ist jedoch eines zu beachten: Wenn Sie einen Reverse-Proxy verwenden, werden die statischen Dateien über Nginx bereitgestellt. Wenn Sie also beispielsweise ein Image im Firebug-Net-Panel öffnen, können Sie den Server weiterhin als Nginx anzeigen
Dav
IMO, das ist die beste Antwort. Diese Lösung erfordert keine spezielle Softwareerweiterung und funktioniert mit dem Basis-Nginx.
Kris
81

Das letzte Update war vor einer Weile, also hier ist, was für mich unter Ubuntu funktioniert hat:

sudo apt-get update
sudo apt-get install nginx-extras

Fügen Sie dann die folgenden zwei Zeilen zu dem httpAbschnitt von hinzu nginx.conf, der sich normalerweise unter /etc/nginx/nginx.conf befindet:

sudo nano /etc/nginx/nginx.conf
server_tokens off; # removed pound sign
more_set_headers 'Server: Eff_You_Script_Kiddies!';

Vergessen Sie auch nicht, nginx mit neu zu starten sudo service nginx restart.

Jamescampbell
quelle
2
Gibt es etwas Ähnliches bei YUM? yum install nginx-extras hat nicht funktioniert.
PKHunter
3
@PKHunter Ich habe es nicht in der Teufelssprache von YUM versucht, aber ich werde sehen, was ich finden kann.
Jamescampbell
2
Dies ist sicherlich die beste Antwort. Es sollte akzeptiert werden. Dies ist nur eine, die alle Fälle beantwortet.
jmcollin92
6
Wenn Sie eine leere Zeichenfolge auf Server setzen, wird der Server-Header unterdrückt:more_set_headers 'Server: ';
Cody Craven
1
Vielen Dank, dies funktioniert wie ein Zauber ohne jegliche Neukompilierung. Gut gemacht;)
MitchellK
37

Bearbeiten Sie einfach /etc/nginx/nginx.conf und entfernen Sie den Kommentar aus

#server_tokens off;

Suchen Sie nach http Abschnitt.

Rui Marques
quelle
3
Das funktioniert gut. Sobald Sie dies getan haben, sehen Sie in den Headern nur noch Informationen zum Server: nginx (keine Versionsnummer) Danke! : D
Jacktrade
13
Dem Autor der Frage ist diese Option bereits bekannt, mit der die Versionsnummer entfernt wird. Sie können jedoch den im "Server" -Header zurückgegebenen Wert nicht anpassen.
Makotosan
12
Dies verbirgt nicht alles, sondern nur die Serverversion.
Digitale Seite
3
Entfernt nicht den
Antwortheader
Ich denke, die Weitergabe der Version von Nginx ist ein Sicherheitsrisiko. Für viele Menschen ist dies eine "gut genug" Lösung. Es ist auch erwähnenswert, dass dies in jeden Serverblock gehen muss, falls Sie einen Serverblock für Port 80 und 443 haben.
Jeremy
35

Es ist ganz einfach: Fügen Sie diese Zeilen zum Serverabschnitt hinzu:

server_tokens off;
more_set_headers 'Server: My Very Own Server';
Farsheed
quelle
10
Sie müssen nginx mit dem Drittanbieter-Modul wiki.nginx.org/HttpHeadersMoreModule dafür kompilieren
Hostmaster
10
Unter Ubuntu können Sie installieren nginx-extra, um dieses Modul zu erhalten.
Stan Bondi
11
Wenn wir glauben wollen, dass Apt-Get Autoexpansion ist, dann sind es Nginx-Extras mit einem "s" am Ende
Tjunkie
1
Beachten Sie, dass Sie das Präfix "Server:" benötigen, um den vorhandenen Server: -Wert zu überschreiben.
ElBradford
25

Es gibt ein spezielles Modul: http://wiki.nginx.org/NginxHttpHeadersMoreModule

Mit diesem Modul können Sie alle von Ihnen angegebenen Ausgabe- oder Eingabekopfzeilen hinzufügen, festlegen oder löschen.

Dies ist eine erweiterte Version des Standard- Header- Moduls, da es mehr Dienstprogramme wie das Zurücksetzen oder Löschen von "eingebauten Headern" wie ,, Content-Typeund Content-LengthbietetServer .

Außerdem können Sie mithilfe der -sOption ein optionales HTTP-Statuscodekriterium und mithilfe der Option ein optionales Inhaltstypkriterium angeben, -twährend Sie die Ausgabeheader mit den Anweisungen more_set_headers und more_clear_headers ändern ...

Flavius
quelle
3
Kompilieren Sie --add-module=/path-to-headers-more-nginx-module
Nginx
Sieht so aus, als wäre dies nach OpenResty verschoben worden: github.com/openresty/headers-more-nginx-module#readme
Ben Creasy
Gibt es eine Möglichkeit, dieses Modul zu erhalten, ohne Nginx aus dem Quellcode für Centos 7 neu kompilieren zu müssen?
Prachi
19

Installieren Sie Nginx Extras

sudo apt-get update
sudo apt-get install nginx-extras

Serverdetails können aus der Antwort entfernt werden, indem die folgenden zwei Zeilen in die Datei nginx.conf eingefügt werden (unter http).

more_clear_headers Server;
server_tokens off;
Aamish Baloch
quelle
Erstens ist dies das, was @jamescampbell oben erwähnt hat. Zweitens erfordert dies, dass Nginx aus dem Quellcode kompiliert wird ( yum install nginx-extrasfunktioniert nicht - ich nehme an, dass dies unter Debia / Ubuntu usw. mit dem funktioniert apt-get.)
Khom Nazid
Es funktioniert, ohne dass Nginx aus dem Quellcode kompiliert wurde. Sie müssen nur das Modul laden: ngx_http_headers_more_filter_module von nginx.conf
creekorful
Nachdem "apt-get install nginx-extras" ausgeführt wurde, wurde die Version meines Nginx von 1.16 auf 1.14 herabgestuft
greyaii
15

Wenn Sie den Header nur in eine andere Zeichenfolge mit maximal fünf Buchstaben ändern möchten, können Sie die Binärdatei einfach patchen.

sed -i 's/nginx\r/thing\r/' `which nginx`

Was als Lösung einige bemerkenswerte Vorteile hat. Das heißt, dass Sie zulassen können, dass Ihre Nginx-Versionierung vom Paketmanager verwaltet wird (also kein Kompilieren aus dem Quellcode), auch wenn für Ihre Distribution keine Nginx-Extras verfügbar sind und Sie sich um keine der zusätzlichen kümmern müssen Code von so etwas wie Nginx-Extras ist anfällig.

Natürlich möchten Sie auch die Option festlegen server_tokens off , die Versionsnummer auszublenden oder auch diese Formatzeichenfolge zu patchen.

Ich sage "fünf Buchstaben oder weniger", weil Sie natürlich immer ersetzen können:

nginx \ r \ 0

mit

bob \ r \ 0 \ r \ 0

Lassen Sie die letzten zwei Bytes unverändert.

Wenn Sie tatsächlich mehr als fünf Zeichen möchten, sollten Sie server_tokens aktiviert lassen und die (etwas längere) Formatzeichenfolge ersetzen. Auch hier gibt es eine Obergrenze für diese Länge, die durch die Länge der Formatzeichenfolge 1 (für die Wagenrücklauf).

... Wenn keiner der oben genannten Punkte für Sie sinnvoll ist oder Sie noch nie zuvor eine Binärdatei gepatcht haben, sollten Sie sich von diesem Ansatz fernhalten.

Parthian Shot
quelle
1
@PKHunter hm? Dies hat den Vorteil, dass es funktioniert, ohne von Grund auf neu kompilieren zu müssen. Kein Quellcode beteiligt. Es wird die kompilierte Binärdatei direkt gepatcht .
Parthian Shot
1
Das Dateiformat ist überhaupt nicht bekannt - es ersetzt lediglich eine Folge von Bytes durch eine andere Folge von Bytes. Es lohnt sich also immer zu überprüfen, ob die Folge von Bytes, die Sie ersetzen, wirklich nur die Zeichenfolge ist, die Sie ersetzen möchten, und nicht B. ausführbarer Code in einem Unterprogramm (was ziemlich unwahrscheinlich ist, aber immer noch).
Parthian Shot
1
Sie führen also einfach den sedobigen Befehl aus, der `which nginx`Teil gibt den Pfad zur Binärdatei zurück und der sedBefehl ersetzt das Byte.
Parthian Shot
1
Die später in der Antwort erwähnten Null-Bytes beziehen sich auf die Tatsache, dass Sie kürzere Header als die gesamte Länge der Zeichenfolge verwenden können, solange Sie die Ersetzung mit einem Null-Byte beenden. en.wikipedia.org/wiki/Null-terminated_string
Parthian Shot
1
Ah. Ja, es ist die ausführbare Datei. Außerdem müssten Sie ein Benutzer mit Schreibberechtigung für die Datei sein. Und ich wäre nicht überrascht, wenn Sie neu starten müssten, damit nginxdie Änderungen wirksam werden. Alles was gesagt hat? Ich fordere Sie auf, keine der anderen Antworten zu verwenden. Wenn Ihnen all die Dinge, die ich sage, noch nicht vertraut sind und Sie nicht wissen, wofür das /etcVerzeichnis gedacht ist, ist ein solcher Hack gefährlich.
Parthian Shot
2

Die einzige Möglichkeit besteht darin, die Datei src / http / ngx_http_header_filter_module.c zu ändern. Ich habe Nginx in Zeile 48 in eine andere Zeichenfolge geändert.

In der Nginx-Konfigurationsdatei können Sie server_tokens festlegen . Dadurch wird verhindert, dass Nginx die Versionsnummer druckt.

Versuchen Sie Curl -I http://vurbu.com/ |, um die Dinge zu überprüfen grep Server

Es sollte zurückkehren

Server: Hai
Jauder Ho
quelle
3
Nun, das ist nicht der einzige Weg. Andere Alternativen wurden in anderen Antworten gezeigt.
Radko Dinev
1

Nachdem ich die Antwort von Parthian Shot gelesen habe, grabe ich mich in eine /usr/sbin/nginxBinärdatei. Dann fand ich heraus, dass die Datei diese drei Zeilen enthält.

Server: nginx/1.12.2
Server: nginx/1.12.2
Server: nginx

Grundsätzlich sind die ersten beiden für die server_tokens on;Direktive gedacht (Server-Version enthalten). Dann ändere ich die Suchkriterien so, dass sie mit diesen Zeilen in der Binärdatei übereinstimmen.

sed -i 's/Server: nginx/Server: thing/' `which nginx`

Nachdem ich weiter gegraben hatte, stellte ich fest, dass die von nginx erzeugte Fehlermeldung auch in dieser Datei enthalten ist.

<hr><center>nginx</center>

Es gibt drei davon, eine ohne Version, zwei davon enthalten die Version. Daher führe ich den folgenden Befehl aus, um die Nginx-Zeichenfolge in der Fehlermeldung zu ersetzen.

sed -i 's/center>nginx/center>thing/' `which nginx`
Afrig Aminuddin
quelle
Danke dafür. Aber Ihr erster Befehl, der innerhalb des /usr/sbinOrdners ausgeführt wird, ergibt sed: can't read is: No such file or directory
Folgendes
1

Laut Nginx- Dokumentation werden benutzerdefinierte Werte oder sogar der Ausschluss unterstützt:

Syntax: server_tokens on | off | build | string;

aber leider nur mit einem kommerziellen abonnement :

Darüber hinaus können im Rahmen unseres kommerziellen Abonnements ab Version 1.9.13 die Signatur auf Fehlerseiten und der Feldwert für den Antwortheader „Server“ explizit mithilfe der Zeichenfolge mit Variablen festgelegt werden. Eine leere Zeichenfolge deaktiviert die Ausgabe des Felds "Server".

adrhc
quelle
0

Ich weiß, dass der Beitrag ein bisschen alt ist, aber ich habe eine einfache Lösung gefunden, die auf Debian-basierter Distribution funktioniert, ohne Nginx aus dem Quellcode zu kompilieren.

Installieren Sie zuerst das Nginx-Extras-Paket

sudo apt install nginx-extras

Laden Sie dann das Modul nginx http headers more, indem Sie die Datei nginx.conf bearbeiten und die folgende Zeile in den Serverblock einfügen

load_module modules / ngx_http_headers_more_filter_module.so;

Sobald dies erledigt ist, haben Sie Zugriff auf die Anweisungen more_set_headers und more_clear_headers.

Creekorful
quelle
0

Das Nginx-Extra-Paket ist jetzt veraltet.

Das Folgende funktionierte daher jetzt für mich, als ich versuchte, verschiedene Pakete zu installieren. More_set_headers 'Server: My Very Own Server';

Sie können einfach Folgendes tun, und es werden keine Server- oder Versionsinformationen zurückgesendet

    server_tokens '';

Wenn Sie nur die Versionsnummer entfernen möchten, funktioniert dies

   server_tokens off;
Prajwal
quelle
-4

Fragen Sie nach dem Server-Header-Wert in der Antwort? Sie können versuchen, dies mit einer Direktive add_header zu ändern, aber ich bin mir nicht sicher, ob es funktionieren wird. http://wiki.codemongers.com/NginxHttpHeadersModule

Vasil
quelle
1
Ja, der Server-Header. aber gibt es nicht einen saubereren weg wie auf lighttpd zum beispiel wo ich nur server.tag = "was auch immer" habe? Der add_header funktioniert nur für die Antwortcodes 200, 204, 301, 302 oder 304. Wenn der Server also irgendwie 500 macht, funktioniert er nicht
Daniels