Redirecionar loop usando o SSL flexível do cloudflare

10

Estou tentando implementar o SSL flexível fornecido pelo CloudFlare no meu site.

Aqui está minha configuração do nginx:

# PHP-FPM upstream; change it accordingly to your local config!
upstream php-fpm {
    server 127.0.0.1:9000;
}

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

server {
    ## Listen ports
    listen 443;

    # use _ if you want to accept everything, or replace _ with domain
    server_name example.com www.example.com;

    location / {
      #proxy_set_header        X-Forwarded-Proto $scheme;
      proxy_set_header X_FORWARDED_PROTO https;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header  Host $http_host;
      proxy_set_header  X-Url-Scheme $scheme;
      proxy_redirect    off;
      proxy_max_temp_file_size 0;
    }

(...rest of config...)

No entanto, quando tento me conectar ao site (Wordpress), recebo um loop de redirecionamento (chrome: ERR_TOO_MANY_REDIRECTS). Como faço para configurar o nginx para evitar isso?

Deqq
fonte

Respostas:

30

O SSL flexível do Cloudflare significa que a conexão entre o cloudflare e seu servidor é sempre feita através de http:

a conexão é sempre http

Diante disso - o único bloco de servidor na questão da relevância é este:

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

Deveria ser óbvio por que isso resulta em um loop de redirecionamento; existem 2 soluções para forçar conexões https usando sua solução SSL flexível.

Use as regras da página do Cloudflare

Se o acesso ao servidor for exclusivamente via cloudflare, você poderá usar as próprias regras de página da cloudflare para modificar as respostas de um domínio, subdomínio ou qualquer padrão de URL:

Usando regras da página do cloudflare

Uma das opções é forçar https:

Sempre use HTTPS

Teste $http_x_forwarded_proto

Há momentos em que você pode evitar o uso de regras de página (apenas raras ou transitórias). Para esses cenários, é possível testar o protocolo encaminhado e redirecionar com base nisso:

server {
   listen         80;
   server_name    example.com www.example.com;

   if ($http_x_forwarded_proto = "http") {
     return 301 https://$server_name$request_uri;
   }

   ... directives to generate a response
}
AD7six
fonte
E haverá erros nas minhas conexões https, como nem tudo é transmitido por http neste caso?
Deqq
Como você configura o cloudflare / nginx não tem relação com isso, o conteúdo html determinará se existem tais erros relatados.
AD7six
A primeira linha desta resposta está incorreta: a conexão entre o navegador e o CloudFlare é criptografada por TLS, a conexão do CloudFlare ao servidor de origem é http. Os loops de redirecionamento podem ser causados ​​por regras de página ou configuração de alto nível especificando o tipo de criptografia incorretamente - por exemplo, cheio quando você realmente precisa de flexibilidade.
Tim
Há também um plugin que ajuda com isso: en-nz.wordpress.org/plugins/cloudflare-flexible-ssl
Tim
5

Isso pode resolver o problema se você tiver o certificado SSL válido no seu computador. Caixa [Crypto] e selecione Full (strict)como na imagem. insira a descrição da imagem aqui

Realmente não há necessidade de atualizar o arquivo de configuração do servidor web para o Nginx.

prosti
fonte
Completo (estrito) só funciona se o servidor da Web de origem tiver um certificado SSL válido com uma cadeia de certificados válida. Trabalhos completos com qualquer certificado SSL, incluindo autoassinado. Esta não é uma boa resposta para a pergunta.
Tim
Sim, entendo agora, a pergunta mencionou o certificado flexível. Melhorarei minha resposta graças aos seus comentários e serei mais específico. Estamos melhorando a base de conhecimento aqui. Um certificado SSL válido tem o melhor valor para o Google se considerarmos a perspectiva de SEO. Não me arrependo depois de postar isso.
prosti
Flexível / completo / estrito não faz diferença para SEO, essa configuração é para conexão ao servidor de origem. Cloudflare apresenta um certificado https compartilhado para quem solicita a página, como ela se conecta à origem é em grande parte irrelevante.
Tim
Supondo que o servidor não tem um certificado SSL válido (o OP não especifica, e eu vim aqui através de uma google configuração similar), esta é uma ótima opção - nota também pode ser delimitado para um subdomínio nomeadamente através das Regras de página.
Skoczen 17/10/19
Esta é uma resposta super boa para mim que tinha um SSL válido.
Philip
0

A resposta do AD7six é muito boa, embora pareça que exista uma solução mais simples que não exija regras de página. Não tenho certeza se essa é uma nova adição desde as respostas anteriores, mas ela definitivamente deve ser documentada sobre essa pergunta, especialmente porque você só recebe três regras de página grátis com o Cloudflare no momento da redação.

Quando o SSL flexível está ativado para um determinado domínio, você pode rolar a Cryptoguia para baixo e ativar a Always use HTTPSopção. Esta opção resolverá perfeitamente o problema do loop de redirecionamento (explicado detalhadamente na resposta do AD7six ).

Opção "Sempre usar HTTPS" do Cloudflare

Esta opção é confirmada trabalhando com nginx; além disso, não deve haver nenhuma configuração de servidor em que essa opção não funcione, desde que o SSL flexível já esteja ativado e funcione sem problemas.

Chade
fonte
Se a interface do usuário do Cloudflare mudou (ou novas opções foram disponibilizadas), seria melhor editar a resposta existente em vez de criar uma resposta concorrente.
AD7six 20/06/19
@ AD7six Eu acredito que isso é uma adição à interface do usuário antiga, não uma substituição, o que significa que a resposta antiga ainda deve ser válida. Portanto, uma resposta separada seria mais lógica do que editar o original, não seria?
Chad
Eu não acho que "você costumava fazer isso o tempo todo, mas agora há um botão para isso!" é uma nova resposta, não :).
AD7six 24/06/19