NGINX redireciona domínios inexistentes

1

Digamos que eu tenha o seguinte domínio:

example.com

com estes subdomínios:

test.example.com

prod.example.com

Tudo só é acessível através de HTTPS. Quando alguém insere https://test2.example.com ou qualquer outro subdomínio inexistente, eles recebem o arquivo NGINX index.html padrão. Em vez disso, quero que eles sejam redirecionados de volta para https://example.com .

Isto é o que parece o meu bloco de servidor /etc/nginx/nginx.conf :

    server {
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  example;
        root         /usr/share/nginx/html;
        index index.html
        ssl on;
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;


        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }

        return  301 https://example.com$request_uri;
    }

Eu esperava que a linha return 301 https://example.com$request_uri; resolvesse esse problema, mas não está funcionando. O Chrome exibe o seguinte erro:

ERR_TOO_MANY_REDIRECTS

O que está funcionando é o URI int, a barra de endereço muda de test2.example.com para example.com . Estou apenas tendo um problema com muitos redirecionamentos. Ou talvez exista uma maneira melhor de fazer isso?

    
por ou_snaaksie 12.01.2017 / 10:09

2 respostas

1

Atualmente, você tem um bloco de servidor que também é o bloco de servidores padrão.

Você deve separar isso em dois blocos. Um bloco lida com os domínios nomeados e outro lida com todos os domínios inexistentes:

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout  10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

server {
    listen  443 ssl default_server;
    listen  [::]:443 ssl default_server;
    return  301 https://example.com$request_uri;
}

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

    server_name  example.com test.example.com prod.example.com;

    root    /usr/share/nginx/html;
    index   index.html

    include /etc/nginx/default.d/*.conf;

    location / {
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

Muitas das diretivas ssl_xxx podem ser colocadas acima dos blocos server (dentro do bloco http ao redor) para que sejam herdadas por ambos - ou você pode copiá-los em cada bloco de servidor (sua escolha).

Veja este documento para saber mais.

    
por 12.01.2017 / 11:16
0

No Nginx, seu server_name poderia ser * .example.com (mas não .example. ), portanto, todos os nomes de host test.example.com, test2.example.com, prod.example.com podem ser servido por um site, se quiser. Se você solicitar um certificado SSL de DNS curinga, poderá usar https em todos os sites sob example.com.

Você pode segregar os sites e usar apenas um certificado, criando um ou mais blocos de servidor no nginx.

    
por 12.01.2017 / 11:16