nginx respondendo a nomes de host desconhecidos?

5

Eu tenho dois domínios que apontam para o mesmo servidor, um que chamamos de home e um que chamamos de web .

Estou executando o nginx na porta 80 para HTTP e 443 para HTTPS. Nas minhas definições de servidor, eu defini dois servidores:

server {
    listen 80;
    server_name web;
    # ...
}

server {
    listen 443;
    server_name web;
    # ...
}

Na prática, funciona muito bem. No entanto, quando tento acessar home , que aponta para o mesmo endereço IP que web , recebo web em vez de obter um 404 ou algo semelhante.

Como posso configurar o nginx para as solicitações 404 que não correspondem ao nome do servidor? Preciso definir um servidor padrão que apenas salta para os 404s?

    
por Naftuli Kay 04.12.2013 / 08:00

3 respostas

5

O bloco do servidor Catchall também precisa de um server_name que você precisa definir para um valor inválido como _ . Dessa forma, o bloco do servidor não corresponderá a nenhum outro nome de host e será usado apenas como último recurso. A configuração ficará assim:

server {
    listen 80;
    listen 443 ssl;

    server_name _;

    return 404;
}
    
por 09.12.2013 / 12:30
5

Para http:

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

Para https, você precisa apontar nginx em ssl cert / key. De acordo com documentação , o nginx examina apenas o cabeçalho 'Host' e não analisa o TLS SNI ao corresponder server_name. Isso significa que o nginx deve ser capaz de aceitar / descriptografar a conexão ssl antes de poder inspecionar o cabeçalho do host.

server {
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate <path to cert>
    ssl_certificate_key <path to key>
    return 404;
}

O certificado / chave pode ser qualquer certificado / chave, por ex. auto-assinado.

Se o cert / key não for especificado, o nginx ainda tentará usar o default_server e falhará, pois não pode aceitar a conexão ssl.

    
por 30.03.2017 / 22:43
2

O primeiro servidor {} na sua configuração é como um pega-pega, então é por isso que ele está sendo mostrado. Adicione algo assim antes do servidor 80 de escuta {}

server {
    return 404;
}

server {
    listen 80;
    server_name web;
    # ...
}

server {
    listen 443;
    server_name web;
    # ...
}
    
por 04.12.2013 / 08:04