Como você altera o cabeçalho do servidor retornado pelo nginx?


141

Existe uma opção para ocultar a versão, para que ela exiba apenas o nginx, mas existe uma maneira de ocultar isso também para que não mostre nada ou mude o cabeçalho?


34
btw, para ocultar a versão do nginx, você precisa definir 'server_tokens off'.
Yanchenko

2
Se você se preocupa em remover o nginx do cabeçalho, também pode removê-lo dos redirecionamentos e das páginas de erro.
Fabianegli #

Respostas:


57

Como o Apache, esta é uma edição rápida na fonte e recompila. Em Calomel.org :

A sequência Server: é o cabeçalho que é enviado de volta ao cliente para informar qual tipo de servidor http você está executando e possivelmente qual versão. Essa sequência é usada por lugares como Alexia e Netcraft para coletar estatísticas sobre quantos e de que tipo de servidor web estão ativos na Internet. Para dar suporte ao autor e às estatísticas do Nginx, recomendamos manter essa sequência como está. Mas, por segurança, você pode não querer que as pessoas saibam o que você está executando e pode mudar isso no código-fonte. Edite o arquivo de origem src/http/ngx_http_header_filter_module.c nas linhas 48 e 49. Você pode alterar a String para o que quiser.

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

Março de 2011 EDIT: Adereços para Flavius abaixo por apontar uma nova opção, substituindo o padrão de Nginx HttpHeadersModule com o bifurcada HttpHeadersMoreModule . A recompilação do módulo padrão ainda é a solução rápida e faz sentido se você deseja usar o módulo padrão e não alterará a sequência do servidor com frequência. Mas se você quiser mais do que isso, o HttpHeadersMoreModule é um projeto forte e permite que você faça todo tipo de magia negra em tempo de execução com seus cabeçalhos HTTP.


18
usando 'server_tokens off;' é de longe a maneira mais fácil de fazer isso ... certifique-se de colocá-lo em um bloco "http" ou "servidor"
farinspace

35
Isso oculta o número da versão, mas a pergunta era "Eu sei que posso ocultar o número da versão, como faço para alterar ou excluir a string inteira do 'Servidor'?" Não há como fazer isso usando o nginx pronto para uso.
Joelhardi

Outra solução rápida (para a versão 1.7.8) para remover completamente o cabeçalho do servidor é: comente as linhas 49 e 50 (correspondentes às linhas 48, 49 acima), 280-283 e 458-469. Para referência futura: os dois últimos são os dois blocos if se configurados r->headers_out.server.
pauluss86

3
Esta resposta é um pouco, mas antiga agora. A resposta de @jamescampbell é mais precisa agora.
Jmcollin92

Se você planeja usar esse método para mascarar o servidor, convém também editar o arquivo src / http / ngx_http_special_response.c para alterar as mensagens de erro do servidor.
Brogan

143

Se você estiver usando o nginx para fazer proxy de um aplicativo de back-end e desejar que o back-end anuncie seu próprio Server:cabeçalho sem que o nginx o substitua, você poderá entrar na server {…}estrofe e definir:

proxy_pass_header Server;

Isso convencerá o nginx a deixar esse cabeçalho sozinho e a não reescrever o valor definido pelo back-end.


11
Se você estiver fazendo essa alteração por motivos de segurança, não tenho certeza de que isso seja suficiente. Se o seu servidor precisar retornar uma mensagem de erro, o cabeçalho continuará sendo 'nginx'
KC Baltz

10
embora isso resolva o problema facilmente, há uma coisa a ser levada em consideração: ao usar um proxy reverso, os arquivos estáticos estão sendo veiculados pelo nginx; portanto, quando você abre, por exemplo, imagem no painel de rede do firebug, ainda pode ver o servidor como nginx
dav

IMO, esta é a melhor resposta. Esta solução não requer nenhuma extensão de software especial e funciona com o nginx base.
Kris

81

A última atualização foi há um tempo atrás, então aqui está o que funcionou para mim no Ubuntu:

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

Em seguida, adicione as duas linhas a seguir na httpseção nginx.confgeralmente localizada em /etc/nginx/nginx.conf:

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

Além disso, não esqueça de reiniciar o nginx com sudo service nginx restart.


2
Existe algo semelhante no YUM? O yum install nginx-extras não funcionou.
PKHunter

3
@PKHunter Eu não tentei na língua do diabo da YUM, mas vou ver o que posso encontrar.
91316 jamescampbell

2
Esta é certamente a melhor resposta. Deve ser aceito. Este é apenas um que responde a todos os casos.
Jmcollin92

6
Definir uma string vazia como Server: suprimirá o cabeçalho do servidor:more_set_headers 'Server: ';
Cody Craven

1
Obrigado, isso funciona como um encanto, sem qualquer recompilação de qualquer tipo. Bem feito;)
MitchellK

37

Simples, edite o /etc/nginx/nginx.conf e remova o comentário de

#server_tokens off;

Procure a seção http .


3
isso funciona bem, depois de fazer tudo o que você pode ver sobre o servidor nos cabeçalhos, as informações são: nginx (sem número de versão) Obrigado! : D
jacktrade

13
O autor da pergunta já está ciente dessa opção, que remove o número da versão, mas não permite que você personalize o valor retornado no cabeçalho "servidor".
Makotosan

12
Isso não oculta tudo, mas apenas a versão do servidor.
Site digital

3
Não remove o cabeçalho de resposta para o servidor = nginx
sasha

Acho que passar a versão do nginx é uma preocupação de segurança. Portanto, para muitas pessoas, essa é uma solução "suficientemente boa". Também é importante notar que este terá que entrar em cada bloco do servidor, no caso de você ter um bloco servidor para a porta 80 e 443.
Jeremy

35

É muito simples: adicione estas linhas à seção do servidor:

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

10
Você precisa compilar o nginx com o módulo de terceiros wiki.nginx.org/HttpHeadersMoreModule para isso
hostmaster

10
No Ubuntu, você pode instalar nginx-extrapara obter esse módulo.
9788 Stanley

11
se quisermos acreditar apt-get autoexpansion, é nginx-extras com um "s" no final
Tjunkie

1
Observe que você precisa do prefixo "Server:" para substituir o valor existente Server:
22317 elBradford

25

Existe um módulo especial: http://wiki.nginx.org/NginxHttpHeadersMoreModule

Este módulo permite adicionar, definir ou limpar qualquer cabeçalho de saída ou entrada que você especificar.

Esta é uma versão aprimorada do módulo de cabeçalhos padrão , pois fornece mais utilitários, como redefinir ou limpar "cabeçalhos internos" Content-Type, como Content-Length, e Server.

Também permite especificar um critério opcional de código de status HTTP usando a -sopção e um critério opcional de tipo de conteúdo usando a -topção enquanto modifica os cabeçalhos de saída com as diretivas more_set_headers e more_clear_headers ...


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

Parece que este foi transferido para OpenResty: github.com/openresty/headers-more-nginx-module#readme
Ben Creasy

Existe alguma maneira de obter esse módulo sem precisar recompilar o nginx da fonte para o Centos 7?
Prachi

19

Instalar extras do Nginx

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

Os detalhes do servidor podem ser removidos da resposta adicionando as seguintes duas linhas no nginx.conf (na seção http)

more_clear_headers Server;
server_tokens off;

Primeiro, é isso que o @jamescampbell mencionado acima. Segundo, isso requer que o Nginx seja compilado a partir do código-fonte ( yum install nginx-extrasnão funciona - suponho que isso funcione no Debia / Ubuntu etc com o apt-get.)
Khom Nazid

Funciona sem ter o nginx compilado a partir da fonte. Você só precisa carregar o módulo: ngx_http_headers_more_filter_module de nginx.conf
creekorful

após a execução de "apt-get install nginx-extras", ele rebaixou a versão do meu nginx 1,16-1,14
grayaii

15

Se você concorda em mudar o cabeçalho para outra sequência de cinco letras ou menos, basta corrigir o binário.

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

Que, como solução, tem algumas vantagens notáveis. Ou seja, você pode permitir que o controle de versão do nginx seja gerenciado pelo gerenciador de pacotes (portanto, sem compilação a partir do código-fonte), mesmo que o nginx-extras não esteja disponível para sua distribuição e você não precise se preocupar com nada disso. código de algo como nginx-extras sendo vulnerável.

Obviamente, você também desejará definir a opção server_tokens off, ocultar o número da versão ou corrigir a formatação da string também.

Eu digo "cinco letras ou menos" porque é claro que você sempre pode substituir:

nginx \ r \ 0

com

bob \ r \ 0 \ r \ 0

deixando os dois últimos bytes inalterados.

Se você realmente quiser mais de cinco caracteres, deixe server_tokens ativado e substitua a string de formato (um pouco mais longa), embora novamente haja um limite superior para esse comprimento imposto pelo comprimento da string de formato - 1 (para o retorno de carro).

... Se nenhuma das opções acima fizer sentido para você, ou você nunca tiver corrigido um binário antes, você pode ficar longe dessa abordagem.


1
@PKHunter hm? A vantagem disso é que ele funciona sem precisar compilar do zero. Nenhum código fonte envolvido. Está corrigindo o binário compilado diretamente.
Parthian Shot

1
Ele não está ciente do formato do arquivo - apenas substitui uma sequência de bytes por uma sequência diferente de bytes -, portanto, sempre vale a pena verificar se a sequência de bytes que você está substituindo é apenas a sequência que você deseja substituir e não , digamos, código executável em uma sub-rotina (o que é bastante improvável, mas ainda).
Parthian Shot

1
Então, você acabou de executar esse sedcomando acima, a `which nginx`parte retorna o caminho para o binário e o sedcomando faz a substituição de bytes.
Parthian Shot

1
Os bytes nulos mencionados posteriormente na resposta referem-se ao fato de que você pode usar cabeçalhos mais curtos que o comprimento total da cadeia, desde que você termine a substituição com um byte nulo. pt.wikipedia.org/wiki/Null-terminated_string
Parthian Shot

1
Ah Sim, é o executável. E você também precisaria ser um usuário com permissão de gravação no arquivo. E não ficaria surpreso se você precisasse reiniciar nginxpara que as alterações entrassem em vigor. Tudo o que disse? Peço que você não use uma das outras respostas. Se todas as coisas que estou dizendo já não lhe são familiares e você não sabe para que /etcserve o diretório, um hack como esse é meio perigoso.
Tiro parta

2

A única maneira é modificar o arquivo src / http / ngx_http_header_filter_module.c. Mudei o nginx na linha 48 para uma string diferente.

O que você pode fazer no arquivo de configuração nginx é desativar server_tokens . Isso impedirá que o nginx imprima o número da versão.

Para verificar as coisas, tente enrolar -I http://vurbu.com/ | Servidor grep

Deve retornar

Server: Hai

3
Bem, esse não é o único caminho. Outras alternativas foram mostradas em outras respostas.
Radko Dinev 28/08

1

Depois de ler a resposta de Parthian Shot, vasculho o /usr/sbin/nginxarquivo binário. Então eu descobri que o arquivo contém essas três linhas.

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

Basicamente, os dois primeiros destinam-se à server_tokens on;diretiva (versão do servidor incluída). Em seguida, altero os critérios de pesquisa para corresponder a essas linhas no arquivo binário.

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

Depois de cavar mais, descobri que a mensagem de erro produzida pelo nginx também está incluída neste arquivo.

<hr><center>nginx</center>

Existem três deles, um sem a versão, dois deles incluíram a versão. Então, eu executo o seguinte comando para substituir a string nginx na mensagem de erro.

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

Obrigado por isso. Mas o seu primeiro comando executado dentro da /usr/sbinpasta gera o seguinte:sed: can't read is: No such file or directory
Khom Nazid 12/02/19

1

De acordo com a documentação do nginx , ele suporta valores personalizados ou até a exclusão:

Syntax: server_tokens on | off | build | string;

mas infelizmente apenas com uma assinatura comercial :

Além disso, como parte de nossa assinatura comercial, a partir da versão 1.9.13, a assinatura nas páginas de erro e o valor do campo de cabeçalho de resposta "Servidor" podem ser definidos explicitamente usando a sequência com variáveis. Uma sequência vazia desativa a emissão do campo "Servidor".


0

Eu sei que o post é meio antigo, mas achei fácil uma solução que funciona na distribuição baseada no Debian sem compilar o nginx a partir do código-fonte.

Primeiro instale o pacote nginx-extras

sudo apt install nginx-extras

Em seguida, carregue o módulo nginx http headers more editando o nginx.conf e adicionando a seguinte linha dentro do bloco do servidor

módulos load_module / ngx_http_headers_more_filter_module.so;

Uma vez feito, você terá acesso às diretivas more_set_headers e more_clear_headers.


0

O pacote Nginx-extra está obsoleto agora.

Portanto, o seguinte funcionou agora para mim, pois tentei instalar vários pacotes more_set_headers 'Server: My Very Own Server';

Você pode fazer o seguinte e nenhuma informação de servidor ou versão será enviada de volta

    server_tokens '';

se você quiser apenas remover o número da versão, isso funciona

   server_tokens off;

-4

Você está perguntando sobre o valor do cabeçalho do servidor na resposta? Você pode tentar mudar isso com uma diretiva add_header, mas não tenho certeza se funcionará. http://wiki.codemongers.com/NginxHttpHeadersModule


1
sim, o cabeçalho do servidor. mas não existe uma maneira mais limpa como no lighttpd, por exemplo, onde eu só tenho server.tag = "tanto faz"? o add_header funciona apenas para códigos de resposta 200, 204, 301, 302 ou 304, por isso, se servidor de alguma forma fazer uma 500 não vai funcionar
Daniels
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.