curinga nginx server_name ou pega-tudo

118

Eu tenho uma instância do nginx em execução que atende a vários sites. A primeira é uma mensagem de status no endereço IP do servidor. O segundo é um console de administração ativado admin.domain.com. Estes funcionam muito bem. Agora, gostaria que todas as outras solicitações de domínio fossem para um único index.php- tenho muitos domínios e subdomínios e é impraticável listá-los todos em uma configuração nginx.

Até agora, tentei definir server_namecomo, *mas falhou como um caractere curinga inválido. *.*funciona até eu adicionar os outros blocos de servidor, então acho que há conflito com eles.

Existe uma maneira de executar um bloco de servidor pega-tudo no nginx depois que outros sites foram definidos?

NB Eu não sou um spammer, estes são sites genuínos com conteúdo útil, eles são movidos pelo mesmo CMS de um banco de dados!

Tak
fonte
1
Melhor usar isso como fonte primária nginx.org/en/docs/http/server_names.html
stephen

Respostas:

147

Altere a opção de escuta para isso em seu bloco pega-tudo do servidor. (Adicionar default_server) isso levará todas as suas conexões não definidas (na porta especificada).

listen       80  default_server;

se você deseja enviar tudo para index.php se o arquivo ou pasta não existir;

try_files                       $uri /$uri /index.php;
Mattias
fonte
Funcionou perfeitamente - muito obrigado. Não pude usar server_name _;para a página de status no endereço IP, tive que especificar, server_name x.x.x.xmas tudo bem!
Tak
1
Adicionar default_serverparece não funcionar no nginx 1.4.6, que atualmente é a versão mais recente do Ubuntu 14.04 ... Quando eu adiciono, o configtestcomando retorna um erro e reiniciar o servidor também não funciona. Eu tentei exatamente a mesma configuração no meu servidor com Debian jessie, que tem nginx 1.6.2, e funciona perfeitamente. Então tente outra versão se você estiver no 1.4.6 ...
Nicomak
1
Nota lateral para HTTPS: a default_serverdiretiva também define o servidor que tratará o handshake SSL para solicitações nessa porta. Portanto, se você deseja que o bloco A do servidor lide com SSL, mas que o servidor B atue como catchall para HTTPS, a solução é configurar server_name ~^(.+)$no servidor B.
Lucas
66

Um sublinhado simples também funciona:

server_name  _;

Fonte: http://nginx.org/en/docs/http/server_names.html

jp.gouigoux
fonte
2
Embora este link possa responder à pergunta, é melhor incluir as partes essenciais da resposta aqui e fornecer o link para referência. As respostas somente com link podem se tornar inválidas se a página vinculada mudar.
Kmeixner
10
O link é fornecido apenas como referência. As duas linhas acima realmente são a resposta: simplesmente colocar um sublinhado como um valor para server_name irá produzir o comportamento desejado "pegar tudo".
jp.gouigoux
55
Esta resposta não é verdadeira. A referência deixa claro que isso não funcionará a menos que você também tenha listen 80 default_serverem sua configuração.
Beetle
5
Veja também este artigo .
Besouro
2
Talvez eu tenha entendido mal os documentos, mas "Não há nada de especial sobre este nome, ele é apenas um entre uma miríade de nomes de domínio inválidos que nunca se cruzam com nenhum nome real. Outros nomes inválidos como“ - ”e“! @ # ”Podem ser usado igualmente. ". Então, _é apenas um nome inválido ?
Florian Klein
26

Isso vai funcionar:

server_name ~^(.+)$
comonitos
fonte
13
server_name ~.parece ser mais eficiente
youfu de
2
Isso funcionou para mim. Por alguma razão eu não consegui fazer o default_server funcionar, ele estava substituindo todos os meus outros vhosts.
NeuroXc
11

Para mim, de alguma forma, definir default_server não estava funcionando. Eu resolvi isso por

server_name ~^.*$

usando a expressão regular de todos.

Ashish
fonte
Tentei todas as opções votadas mais altas e esta é a única que funcionou. NOTA: Estou tentando chegar a um servidor com seu endereço IP vs. URL.
Mampersat
9

Apenas 1 serverdiretiva

Do Nginx listenDocs

O parâmetro default_server, se presente, fará com que o servidor se torne o servidor padrão para o endereço especificado: par de portas. Se nenhuma das diretivas tiver o parâmetro default_server, então o primeiro servidor com o par endereço: porta será o servidor padrão para este par.

Se você tiver apenas 1 serverdiretiva, que tratará de todas as solicitações, você não precisa definir nada.


Múltiplo serverDiretriz

Se você quiser combinar todas as solicitações com a serverdiretiva especificada , basta adicionar o default_serverparâmetro a listen, o Nginx usará esta serverdiretiva como padrão.

server {
    listen 80 default_server;
}

Sobre server_name _;

Do Nginx Docs

Em exemplos de servidor pega-tudo, o nome estranho “_” pode ser visto:

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

Não há nada de especial neste nome, ele é apenas um entre uma miríade de nomes de domínio inválidos que nunca se cruzam com nenhum nome real. Outros nomes inválidos como “-” e “! @ #” Também podem ser usados.

Não importa o que server_namevocê defina, é apenas um nome de domínio inválido .

Asa de Aço
fonte
4

Agora você pode usar a máscara:

server {
    listen       80;
    server_name  *.example.org;
    ...
}

server {
    listen       80;
    server_name  mail.*;
    ...
}

Veja mais aqui: http://nginx.org/en/docs/http/server_names.html

redflasher
fonte
2

Se você também deseja capturar solicitações com Hostcabeçalho vazio (o que é permitido em HTTP / 1.0 ), você pode usar regex e vazio server_name:

server {
    listen      80;
    server_name ~. "";
}
Pavel Golubev
fonte