Redirecionar para https, a menos que seja de rede privada no nginx

Redirecionar para https, a menos que seja de rede privada no nginx

Gostaria de redirecionar todas as solicitações provenientes de fora da rede para https - mas manter as internas em http.

No momento, tenho dois .confarquivos - um que começa assim:

server {
        # listen [::]:443 ssl ipv6only=on; # managed by Certbot                                                                                                                                              
        listen 443 ssl; # managed by Certbot                                                                                                                                                                 
        server_name www.example.com , example.com;         
        # omitted stuff
}

e contém

server {
    listen 80;
    server_name www.example.com , example.com;         
    return 301 https://$host$request_uri;
}

e outro que começa assim:

server {                                                                                                                                                                                                     
        listen 192.168.1.144:80;                                                                                                                                                                             
        listen 192.168.1.196:80;                                                                                                                                                                             
                                                                                                                                                                                                             
        server_name "";                                                                                                                                                                                      
        root /var/www/html;                                                                                                                                                                                  
        # omitted stuff
   }

Mas agora pede parahttp://exemplo.comnão seja redirecionado para https.

Por que é que? o que eu errei? meu objetivo é redirecionar todas as solicitações que não vêm da rede privada doméstica ( 192.168.1.*) para https e deixar as internas de lado.

Responder1

server_namediretiva usa espaços para separar nomes de domínio. Sua configuração possui vírgulas, o que confunde o nginx.

Você precisa usar:

server_name www.example.com example.com;

Responder2

Presumo que com o seguinte você esteja tentando criar um bloco de servidor diferente que escute duas interfaces na rede local:

server {
    listen 192.168.1.144:80;
    listen 192.168.1.196:80;
    # ...
}

Para que isso funcione, sua topologia seria semelhante a esta:

Topologia com Nginx conectado diretamente à Internet

Porém, se o seu servidor estiver usando o mesmo NAT dos clientes da rede privada 192.168.1.0/24, esse serverbloco também será usado para conexões externas. Esta topologia seria semelhante a esta:

Topologia com NAT e encaminhamento de porta

Com o último, você poderia usar, por exemplo, ongx_http_geo_modulepara separar a rede local com base em seus clientes:

geo $external {
    default         1;
    192.168.1.0/24  0;
}

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/html;
    
    if ($external) {
        return 301 https://$server_name$request_uri;
    }
}

No entanto, do ponto de vista da segurança, eu não recomendaria confiar na sua rede interna dessa forma, mas usar o TLS igualmente para todos os clientes. Isso porque é fácil obter a posição MitM simplesmente tendo acesso à rede local.

Responder3

Tente isso para o redirecionamento e, para o interno, pessoalmente prefiro criar o nome do servidor por endereço IP.

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

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

    ssl_certificate /etc/ssl/example.crt;
    ssl_certificate_key /etc/ssl/example.key;

    server_name example.com www.example.com;

    location{
       .......
    }
}

informação relacionada