¿Cómo se cambia el encabezado del servidor devuelto por nginx?


141

Hay una opción para ocultar la versión para que solo muestre nginx, pero ¿hay alguna forma de ocultarla también para que no muestre nada o cambie el encabezado?


34
por cierto, para ocultar la versión nginx, debe configurar 'server_tokens off'.
yanchenko

2
Si le interesa eliminar nginx del encabezado, también puede eliminarlo de las redirecciones y páginas de error.
fabianegli

Respuestas:


57

Al igual que Apache, esta es una edición rápida de la fuente y se vuelve a compilar. De Calomel.org :

El servidor: cadena es el encabezado que se envía de vuelta al cliente para decirles qué tipo de servidor http está ejecutando y posiblemente qué versión. Lugares como Alexia y Netcraft utilizan esta cadena para recopilar estadísticas sobre cuántos y de qué tipo de servidor web viven en Internet. Para admitir el autor y las estadísticas de Nginx, recomendamos mantener esta cadena como está. Pero, por seguridad, es posible que no desee que las personas sepan lo que está ejecutando y puede cambiar esto en el código fuente. Edite el archivo fuente src/http/ngx_http_header_filter_module.c mirando las líneas 48 y 49. Puede cambiar la cadena a lo que desee.

## 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;

Edición de marzo de 2011: A continuación, apoyamos a Flavius ​​para señalar una nueva opción, reemplazando el HttpHeadersModule estándar de Nginx con el HttpHeadersMoreModule bifurcado . Volver a compilar el módulo estándar sigue siendo la solución rápida, y tiene sentido si desea usar el módulo estándar y no cambiará la cadena del servidor con frecuencia. Pero si desea más que eso, HttpHeadersMoreModule es un proyecto sólido y le permite hacer todo tipo de magia negra en tiempo de ejecución con sus encabezados HTTP.


18
usando 'server_tokens off;' es, con mucho, la forma más fácil de hacerlo ... asegúrese de ponerlo en un bloque "http" o "servidor"
farinspace

35
Eso oculta el número de versión, pero la pregunta era "Sé que puedo ocultar el número de versión, ¿cómo cambio o elimino toda la cadena 'Servidor'?" No hay forma de hacerlo usando nginx listo para usar.
joelhardi

Otra solución rápida (para la versión 1.7.8) para eliminar completamente el encabezado del servidor es: comentar las líneas 49 y 50 (correspondientes a las líneas 48, 49 anteriores), 280-283 y 458-469. Para referencia futura: los dos últimos son ambos bloques if que se establecen r->headers_out.server.
pauluss86

3
Esta respuesta es un poco pero vieja ahora. La respuesta de @jamescampbell es más precisa ahora.
jmcollin92

Si planea usar este método para enmascarar su servidor, también puede editar el archivo src / http / ngx_http_special_response.c para cambiar los mensajes de error del servidor.
Brogan

143

Si está utilizando nginx para proxy una aplicación de fondo y desea que el back-end anuncie su propio Server:encabezado sin que nginx lo sobrescriba, entonces puede ir dentro de su server {…}stanza y configurar:

proxy_pass_header Server;

Eso convencerá a nginx de dejar ese encabezado solo y no reescribir el valor establecido por el back-end.


11
Si está realizando este cambio por razones de seguridad, no estoy seguro de que sea suficiente. Si su servidor necesita devolver un mensaje de error, el encabezado seguirá siendo 'nginx'
KC Baltz

10
aunque esto resuelve el problema fácilmente, sin embargo, hay una cosa a tener en cuenta: cuando se usa un proxy inverso, los archivos estáticos se sirven a través de nginx, por lo que cuando abre, por ejemplo, la imagen en el panel de red firebug, aún puede ver el servidor como nginx
dav

OMI, esta es la mejor respuesta. Esta solución no requiere ninguna extensión de software especial y funciona con la base nginx.
Kris

81

La última actualización fue hace un tiempo, así que esto es lo que funcionó para mí en Ubuntu:

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

Luego agregue las siguientes dos líneas a la httpsección de nginx.conf, que generalmente se encuentra en /etc/nginx/nginx.conf:

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

Además, no olvide reiniciar nginx con sudo service nginx restart.


2
¿Hay algo similar en YUM? yum install nginx-extras no funcionó.
PKHunter

3
@PKHunter No lo he probado en la lengua del diablo de YUM, pero veré lo que puedo encontrar.
jamescampbell

2
Esta es ciertamente la mejor respuesta. Debería ser aceptado. Este es solo uno que responde a todos los casos.
jmcollin92

66
Establecer una cadena vacía en el Servidor: suprimirá el encabezado del servidor:more_set_headers 'Server: ';
Cody Craven

1
Gracias, esto funciona de maravilla sin ningún tipo de recompilación. Bien hecho;)
MitchellK

37

Simple, edite /etc/nginx/nginx.conf y elimine el comentario de

#server_tokens off;

Busca la sección http .


3
esto funciona bien, una vez que haga esto, todo lo que puede ver sobre el servidor en la información de encabezados es: nginx (sin número de versión) ¡Gracias! : D
jacktrade

13
El autor de la pregunta ya conoce esta opción, que elimina el número de versión, pero no le permite personalizar el valor que se devuelve en el encabezado "servidor".
Makotosan

12
Esto no oculta todo, sino solo la versión del servidor.
Sitio digital

3
No elimina el encabezado de respuesta para Server = nginx
sasha

Creo que pasar la versión de nginx es un problema de seguridad. Entonces, para muchas personas, esta es una solución "suficientemente buena". También vale la pena señalar que esto tendrá que ir a cada bloque de servidor, en caso de que tenga un bloque de servidor para los puertos 80 y 443.
Jeremy

35

Es muy simple: agregue estas líneas a la sección del servidor:

server_tokens off;
more_set_headers 'Server: My Very Own Server';

10
Tienes que compilar nginx con el módulo de terceros wiki.nginx.org/HttpHeadersMoreModule para eso
hostmaster

10
En Ubuntu puedes instalar nginx-extrapara obtener ese módulo.
Stan Bondi

11
si creemos que apt-get autoexpansion, son nginx-extras con una "s" al final
Tjunkie

1
Tenga en cuenta que necesita el prefijo "Servidor:" para anular el valor Servidor existente.
elBradford

25

Hay un módulo especial: http://wiki.nginx.org/NginxHttpHeadersMoreModule

Este módulo le permite agregar, establecer o borrar cualquier salida o encabezado de entrada que especifique.

Esta es una versión mejorada de la norma cabeceras módulo, ya que proporciona más utilidades como restablecer o compensación "incorporado cabeceras" como Content-Type, Content-Length, y Server.

También le permite especificar un criterio de código de estado HTTP opcional usando la -sopción y un criterio de tipo de contenido opcional usando la -topción mientras modifica los encabezados de salida con las directivas more_set_headers y more_clear_headers ...


3
Compile nginx con--add-module=/path-to-headers-more-nginx-module
mate64

Parece que esto se movió a OpenResty: github.com/openresty/headers-more-nginx-module#readme
Ben Creasy

¿Hay alguna forma de obtener este módulo sin tener que volver a compilar nginx desde la fuente para Centos 7?
Prachi

19

Instalar Nginx Extras

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

Los detalles del servidor se pueden eliminar de la respuesta agregando las siguientes dos líneas en el nginx.conf (en la sección http)

more_clear_headers Server;
server_tokens off;

Uno, esto es lo que @jamescampbell mencionó anteriormente. En segundo lugar, esto requiere que Nginx se compile desde la fuente ( yum install nginx-extrasno funciona, supongo que esto funciona en Debia / Ubuntu, etc. con el apt-get.)
Khom Nazid

Funciona sin tener nginx compilado desde la fuente. Solo necesita cargar el módulo: ngx_http_headers_more_filter_module de nginx.conf
creekorful

después de ejecutar "apt-get install nginx-extras", bajó la versión de mi nginx de 1.16 a 1.14
grayaii

15

Si está de acuerdo con cambiar el encabezado a otra cadena de cinco letras o menos, simplemente puede parchear el binario.

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

Lo cual, como solución, tiene algunas ventajas notables. Es decir, que puede permitir que el administrador de paquetes maneje sus versiones de nginx (por lo tanto, sin compilar desde la fuente) incluso si nginx-extras no está disponible para su distribución, y no necesita preocuparse por ninguno de los El código de algo como nginx-extras es vulnerable.

Por supuesto, también querrá establecer la opción server_tokens off, para ocultar el número de versión, o parchear esa cadena de formato también.

Digo "cinco letras o menos" porque, por supuesto, siempre puedes reemplazar:

nginx \ r \ 0

con

bob \ r \ 0 \ r \ 0

dejando los dos últimos bytes sin cambios.

Si realmente desea más de cinco caracteres, querrá dejar server_tokens y reemplazar la cadena de formato (un poco más larga), aunque nuevamente hay un límite superior en esa longitud impuesto por la longitud de la cadena de formato - 1 (para el retorno de carro).

... Si nada de lo anterior tiene sentido para usted, o si nunca ha parcheado un binario antes, es posible que desee mantenerse alejado de este enfoque.


1
@PKHunter hm? La ventaja de esto es que funciona sin tener que compilar desde cero. No hay código fuente involucrado. Está parcheando el binario compilado directamente.
Parthian Shot

1
No tiene conocimiento del formato de archivo en absoluto, solo está reemplazando una secuencia de bytes con una secuencia diferente de bytes, por lo que siempre vale la pena verificar que la secuencia de bytes que está reemplazando realmente sea solo la cadena que desea reemplazar y no , digamos, código ejecutable en una subrutina (que es bastante improbable, pero aún así).
Disparo de Partia

1
Entonces, simplemente ejecute el sedcomando anterior, la `which nginx`parte devuelve la ruta al binario y el sedcomando reemplaza el byte.
Disparo de Partia

1
Los bytes nulos mencionados más adelante en la respuesta se refieren al hecho de que puede usar encabezados más cortos que la longitud total de la cadena siempre que finalice el reemplazo con un byte nulo. en.wikipedia.org/wiki/Null-terminated_string
Parthian Shot

1
Ah Sí, es el ejecutable. Y también necesitaría ser un usuario con permiso de escritura en el archivo. Y no me sorprendería si necesitara reiniciar nginxpara que los cambios surtan efecto. Todo eso dicho? Te insto a que no uses una de las otras respuestas. Si todas las cosas que digo ya no te son familiares y no sabes para qué /etcsirve el directorio, un truco como este es un poco peligroso.
Parthian Shot

2

La única forma es modificar el archivo src / http / ngx_http_header_filter_module.c. Cambié nginx en la línea 48 a una cadena diferente.

Lo que puede hacer en el archivo de configuración nginx es desactivar server_tokens . Esto evitará que nginx imprima el número de versión.

Para ver las cosas, intente curl -I http://vurbu.com/ | servidor grep

Debería volver

Server: Hai

3
Bueno, esa no es la única forma. Se han mostrado otras alternativas en otras respuestas.
Radko Dinev

1

Después de leer la respuesta de Parthian Shot, busco en el /usr/sbin/nginxarchivo binario. Luego descubrí que el archivo contiene estas tres líneas.

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

Básicamente, los dos primeros están destinados a la server_tokens on;directiva (versión del servidor incluida). Luego cambio los criterios de búsqueda para que coincidan con esas líneas dentro del archivo binario.

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

Después de profundizar más, descubrí que el mensaje de error producido por nginx también se incluye en este archivo.

<hr><center>nginx</center>

Hay tres de ellos, uno sin la versión, dos de ellos incluyen la versión. Entonces ejecuto el siguiente comando para reemplazar la cadena nginx dentro del mensaje de error.

sed -i 's/center>nginx/center>thing/' `which nginx`

Gracias por esto. Pero su primer comando ejecutado dentro de la /usr/sbincarpeta produce esto:sed: can't read is: No such file or directory
Khom Nazid

1

Según la documentación de nginx , admite valores personalizados o incluso la exclusión:

Syntax: server_tokens on | off | build | string;

pero lamentablemente solo con una suscripción comercial :

Además, como parte de nuestra suscripción comercial, a partir de la versión 1.9.13, la firma en las páginas de error y el valor del campo del encabezado de respuesta "Servidor" se pueden establecer explícitamente utilizando la cadena con variables. Una cadena vacía deshabilita la emisión del campo "Servidor".


0

Sé que la publicación es un poco antigua, pero he encontrado una solución fácil que funciona en la distribución basada en Debian sin compilar nginx desde la fuente.

Primero instale el paquete nginx-extras

sudo apt install nginx-extras

Luego cargue el módulo más de encabezados http nginx editando nginx.conf y agregando la siguiente línea dentro del bloque del servidor

load_module modules / ngx_http_headers_more_filter_module.so;

Una vez hecho esto, tendrá acceso a las directivas more_set_headers y more_clear_headers.


0

El paquete Nginx-extra está en desuso ahora.

Por lo tanto, lo siguiente ahora funcionó para mí cuando intenté instalar varios paquetes more_set_headers 'Servidor: Mi propio servidor';

Simplemente puede hacer lo siguiente y no se devolverá ninguna información de servidor o versión

    server_tokens '';

si solo quieres eliminar el número de versión, esto funciona

   server_tokens off;

-4

¿Pregunta sobre el valor del encabezado del servidor en la respuesta? Puede intentar cambiar eso con una directiva add_header, pero no estoy seguro de si funcionará. http://wiki.codemongers.com/NginxHttpHeadersModule


1
Sí, el encabezado del servidor. pero ¿no hay una forma más limpia como en lighttpd, por ejemplo, donde solo tengo server.tag = "whatever"? add_header solo funciona para los códigos de respuesta 200, 204, 301, 302 o 304, por lo que si el servidor de alguna manera hace un 500 no funcionará
daniels
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.