Como definir o caminho raiz do nginx com base no host

Como definir o caminho raiz do nginx com base no host

Como posso configurar um host de visitante para usar um caminho raiz específico no nginx?

Visitante com IP 1.1.1.1 usará

root /srv/web1

todos os outros visitantes usarão

root /srv/web2

Responder1

Embora esta questão seja facilmente respondida simplesmente fazendo um pouco de pesquisa e lendo a documentação (de preferência começando peloGuia do iniciantee entãoComo o nginx processa uma solicitação), vou responder de qualquer maneira.

Presumo que você tenha um servidor com mais de uma interface de rede e endereço IP, onde o endereço 1.1.1.1 é atribuído a uma interface e outros endereços às suas respectivas interfaces.

O Nginx é muito flexível nesse aspecto, na verdade, sempre há um serverbloco que é usado como padrão quando o nginx não consegue corresponder a nenhum outro bloco do servidor server_name: esse é o primeiro serverbloco do arquivo ou aquele que especifica default_serverem sua listendiretiva . E lembre-se dissovocê pode especificar um IP na listendiretiva.

Isso significa, no seu caso:

server {
    listen 80 default_server;
    root /srv/web2;
    [...]
}
server {
    listen 1.1.1.1:80;
    root /srv/web1;
    [...]
}

Como você pode ver no exemplo acima, o primeiro serverbloco escuta em todas as interfaces na porta 80, enquanto o segundo bloco escuta apenas na interface 1.1.1.1, na porta 80. Portanto, qualquer pessoa que visite seu site através da interface de rede 1.1.1.1 receberá arquivos de /srv/web1, independentemente do campo Host na solicitação HTTP (ou seja, o nome de domínio escrito na barra de URL).

Outro comportamento semelhante pode ser obtido colocando o endereço IP na server_namediretiva, assim:

server {
    listen 80;
    server_name 1.1.1.1;
    [...]
}
* Observe que este último serverbloco captura apenas solicitações para o endereço IP literal e não para nomes de domínio.

Espero que isso responda à sua pergunta, mas da próxima vez coloque informações adicionais sobre sua configuração atual e faça algumas pesquisas.

Atualizar

Para obter o comportamento descrito você pode usar olocalização geográficamódulocomo explicado emessa questão:

geo $client {
    default web2;
    1.1.1.1 web1;
}
server {
    [...]
    root /srv/$client;
    [...]
}
Esta configuração usa olocalização geográficamódulo para definir uma variável ( $client) com base no endereço IP do cliente. Essa variável é definida como o padrãoweb2ou o específicoweb1e depois é substituído na rootdirectiva.

Observe que a geodiretiva deve estar dentro do httpbloco e não servernos blocos; o trecho acima deve funcionar como está, mas não garanto nada, pois não testei.

informação relacionada