Nginx: Como evitar o aviso duplicado server_name

2

Eu atendo um site do nginx que está disponível tanto com nomes de host internos quanto externos. Eu quero forçar o acesso externo a usar https, mas manter o http para acesso interno (porque não consigo obter certificados para esses endereços internos).

A seguinte configuração faz o que eu quero:

#redirect port 80 http to 443 https
server{
    listen 80 default_server;
    listen [::]:80 default_server;
    #just for external access
    server_name hostname.external_domain;
    return 301 https://$host$request_uri;
}

# serve both http and https internally
server {
    listen 80;
    listen 443 ssl;
    listen [::]:80;
    listen [::]:443 ssl;

    server_name hostname hostname.internal_domain hostname.external_domain;

...

mas nginx -t me dá o aviso

nginx: [warn] conflicting server name "hostname.external_domain" on 0.0.0.0:80, ignored

porque esse nome do host é usado nas duas definições do servidor. Mas ele precisa estar lá, senão não vou pegar a tentativa de acesso http ou a redirecionada.

Eu sei que poderia adicionar uma terceira definição de servidor com apenas a porta 443 e sem a porta 80 para hostname.external_domain e remover apenas este nome do segundo servidor e isso provavelmente removeria o aviso, mas eu teria de copiar o todo o conteúdo do bloco de servidores também, o que acho redundante.

Existe uma solução melhor?

    
por Chaos_99 30.09.2018 / 22:48

1 resposta

1

Opção 1.

Use três server blocos (como mencionado em sua pergunta), mas descarregar o conteúdo duplicado em um arquivo separado, usando uma diretiva include para puxá-lo para cada um dos blocos server relevantes. Consulte este documento para obter detalhes.

Opção 2.

O default_server não precisa de uma instrução server_name . No entanto, você deve trocar o default_server pelo outro bloco server , para que o primeiro bloco server se torne o mais específico.

Por exemplo:

server{
    listen 80;
    listen [::]:80;
    server_name hostname.external_domain;
    return 301 https://$host$request_uri;
}

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    listen [::]:80 default_server;
    listen [::]:443 ssl default_server;

    ...
}

O segundo server_block não precisa corresponder usando server_name , pois corresponderá a qualquer coisa que o primeiro bloco server não corresponda explicitamente.

    
por 30.09.2018 / 23:26