Redirecionar loop ao forçar o SSL no servidor Nginx

3

Ultimamente, tenho tentado redirecionar para HTTPS usando o Nginx, mas continuo recebendo um loop de redirecionamento depois que tento visitar meu site em um navegador. Aqui está o meu arquivo de configuração do bloco do servidor completo:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    listen 443 ssl;

    root /var/www;
    index index.php index.html index.htm home.html contact.html projects.html;

    # Make site accessible from http://localhost/
    server_name melone.co;
    return 301  https://$host$request_uri;
    ssl_certificate /path/to/ssl;
    ssl_certificate_key /path/to/ssl;


    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
        proxy_set_header        X-Forwarded-Proto $scheme;
    }
    error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        root /var/www;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

}

Depois de pesquisar, descobri que return 301 https://$host$request_uri; seria a maneira mais fácil de fazer isso.

Então, eu o implementei no meu arquivo de configuração e executei sudo service nginx restart . Então fui ao meu navegador e recebi um loop de redirecionamento. Depois que eu removi essa linha de código, ela desapareceu. Então, o que eu acho que estou realmente procurando é uma maneira mais eficiente de redirecionar para SSL.

Qualquer ajuda seria apreciada. Obrigado

    
por cmelone 13.12.2015 / 00:17

2 respostas

7

No momento, você está redirecionando todo o tráfego para https , o que é bom para http tráfego, mas para https o tráfego é totalmente inútil e resulta em um loop de redirecionamento. O que está acontecendo agora é o seguinte: http - > https - > https - > https - > https - > https ... e assim por diante, até o ponto em que seu navegador lhe diz: "é o suficiente, não teremos sucesso".

O que você deseja alcançar é redirecionar http tráfego para https e processar o tráfego https (como você fez antes com o tráfego http ).

Portanto, você terá que dividir sua configuração em duas diretivas server : uma para http (que deve fazer o redirecionamento), a outra para https , que processará o tráfego.

Veja este exemplo:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    server_name melone.co;
    return 301 https://$host$request_uri;
}

Adicione este bloco server à sua configuração, remova as linhas correspondentes em seu bloco server existente e lucre!

    
por 13.12.2015 / 00:47
2

Ok, achei o problema. Eu preciso de dois blocos de servidores. Um escuta na porta 80 e redireciona para 443.

Eu adicionei isso ao topo do meu conf:

server {
    listen 80 ;
       server_name    melone.co;
       return         301 https://$server_name$request_uri;
}
    
por 13.12.2015 / 00:43