Nginx root baseado no hostname sem www

1

O inglês não é meu idioma nativo. Aceite minhas desculpas por qualquer problema de idioma.

Eu quero uma configuração com raiz automática, independentemente do domínio, se parece com isso (usando nginx):

root /var/www/${http_host}/public

Mas quero que o domínio raiz e o "www" apontem para o mesmo diretório, mas sem o "www":

Exemplo:

  1. " www.mysite.com " e " meusite.com "

    raiz / var / www / meusite.com / public

  2. Mas " blog.mysite.com "

    raiz /var/www/blog.mysite.com/public

Ou seja, apenas o "www" deve apontar para o diretório que não tem "www" no nome.

Sim, vi que existem outras perguntas semelhantes ( como este ), mas tive dificuldade em remover o "www". Com licença!

Eu não usarei um nome de servidor genérico , mas isso deve funcionar mesmo com:

server_name ~.+$;

Mas também:

listen 443 ssl http2;

server_name ~ ^((www|blog|account|bbs)\.)?mysite.com$;

root /var/www/${http_host}/public

ssl_certificate /ssl/${http_host}/{http_host}.pem
ssl_certificate_key /ss/${http_host}/{http_host}.key

NOTA: Deve funcionar com a partir do caminho do certificado ssl.

    
por guinalz 26.01.2017 / 01:18

1 resposta

3

Você pode usar um map no bloco http da seguinte forma:

map $http_host $rootdir {
    "~^(?:www\.)?(<domain>.+)$ $domain;
}

E, em seguida, você usa o seguinte no bloco server :

root /var/www/$rootdir/public;

Na diretiva map , convertemos a variável $http_host contendo a solicitação HTTP Host header para $rootdir usando a expressão regular.

Na expressão regular, extraímos o nome do domínio real para a variável $domain do cabeçalho Host , excluindo o prefixo www. , se existir. Em seguida, usamos a variável $domain para criar a variável $rootdir .

No entanto, esse método pode não funcionar com SSL devido a motivos mencionados no comentário. Nesse caso, você precisa implementar um sistema de gerenciamento de configuração que gere arquivos de configuração para domínios a partir de modelos.

    
por 26.01.2017 / 02:12

Tags