Boucle de redirection à l'aide de SSL flexible Cloudflare

10

J'essaie d'implémenter SSL flexible fourni par CloudFlare sur mon site.

Voici ma configuration 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...)

Cependant, lorsque j'essaie de me connecter au site Web (Wordpress), j'obtiens une boucle de redirection (chrome: ERR_TOO_MANY_REDIRECTS). Comment configurer nginx pour éviter cela?

Deqq
la source

Réponses:

30

Le SSL flexible de Cloudflare signifie que la connexion entre cloudflare et votre serveur est toujours via http:

la connexion est toujours http

Compte tenu de cela - le seul bloc serveur dans la question de la pertinence est celui-ci:

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

Il devrait être évident pourquoi cela se traduit par une boucle de redirection, il existe 2 solutions pour forcer les connexions https à l'aide de leur solution SSL flexible.

Utilisez les règles de page de Cloudflare

Si l' accès au serveur se fait exclusivement via cloudflare, vous pouvez utiliser les propres règles de page de cloudflare pour modifier les réponses d'un domaine, d'un sous-domaine ou de n'importe quel modèle d'URL:

Utilisation des règles de page de cloudflare

L'une des options consiste à forcer https:

Utilisez toujours HTTPS

Tester $http_x_forwarded_proto

Il peut arriver que vous souhaitiez éviter d'utiliser des règles de page (qui devraient être rares ou transitoires uniquement), pour ces scénarios, il est possible de tester le protocole transféré et de rediriger en fonction de cela:

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
la source
Et y aura-t-il des erreurs dans mes connexions https telles que tout n'est pas transmis via http dans ce cas?
Deqq
Comment vous configurez cloudflare / nginx n'a aucune incidence sur cela, le contenu html déterminera si de telles erreurs sont signalées.
AD7six
La première ligne de cette réponse est incorrecte: la connexion entre le navigateur et CloudFlare est cryptée TLS, la connexion de CloudFlare au serveur d'origine est http. Les boucles de redirection peuvent être provoquées par des règles de page ou un paramètre de haut niveau spécifiant le type de cryptage de manière incorrecte - par exemple complet lorsque vous avez vraiment besoin de flexibilité.
Tim
Il y a aussi un plugin qui aide à cela: en-nz.wordpress.org/plugins/cloudflare-flexible-ssl
Tim
5

Cela peut résoudre le problème si vous avez le certificat SSL valide sur votre. [Crypto] et sélectionnez Full (strict)comme dans l'image. entrez la description de l'image ici

Pas vraiment besoin de mettre à jour le fichier de configuration du serveur Web pour Nginx.

prosti
la source
Full (strict) ne fonctionne que si le serveur Web d'origine possède un certificat SSL valide avec une chaîne de certificats valide. Fonctionne pleinement avec n'importe quel certificat SSL, y compris auto-signé. Ce n'est pas une bonne réponse à la question.
Tim
Oui, je vois maintenant, la question mentionnait le certificat flexible. J'améliorerai ma réponse grâce à vos retours et je serai plus précis. Nous améliorons la base de connaissances ici. Un certificat SSL valide a la meilleure valeur pour Google si nous considérons la perspective SEO. Je ne regrette pas après avoir posté cela.
prosti
Flexible / complet / strict ne fait aucune différence pour le référencement, ce paramètre est pour la connexion au serveur d'origine. Cloudflare présente un certificat https partagé à quiconque demande la page, la façon dont il se connecte à l'origine est largement hors de propos.
Tim
En supposant que le serveur possède un certificat SSL valide (l'OP ne le spécifie pas, et je suis venu ici via un config google similaire), c'est une excellente option - notez qu'il peut également être étendu à un sous-domaine particulier via les règles de page.
skoczen
C'est une super bonne réponse pour moi qui avait un SSL valide.
Philip
0

La réponse d'AD7six est très bonne, bien qu'il semble qu'il existe une solution plus simple qui ne nécessite pas de règles de page. Je ne sais pas s'il s'agit d'un nouvel ajout depuis les réponses précédentes, mais il devrait certainement être documenté sur cette question, d'autant plus que vous n'obtenez que 3 règles de page gratuite avec Cloudflare au moment de la rédaction.

Lorsque le SSL flexible est activé pour un domaine donné, vous pouvez faire défiler vers le bas sur l' Cryptoonglet et activer l' Always use HTTPSoption. Cette option résoudra de manière transparente le problème de la boucle de redirection (expliqué en détail dans la réponse d'AD7six ).

L'option «Toujours utiliser HTTPS» de Cloudflare

Cette option est confirmée en travaillant avec nginx; en outre, il ne devrait pas y avoir de configuration de serveur où cette option ne fonctionne pas, à condition que le SSL flexible soit déjà activé et fonctionne sans problème.

Tchad
la source
Si l'interface utilisateur de Cloudflare a changé (ou de nouvelles options ont été rendues disponibles), il serait préférable de modifier la réponse existante plutôt que de créer une réponse concurrente.
AD7six
@ AD7six Je pense que c'est un ajout à l'ancienne interface utilisateur, pas un remplacement, ce qui signifie que l'ancienne réponse doit toujours être valide. Par conséquent, une réponse séparée serait plus logique que l'édition de l'original, n'est-ce pas?
Chad
Je ne pense pas "Avant, vous deviez le faire sur le long terme, mais maintenant il y a un bouton pour ça!" est une nouvelle réponse, non :).
AD7six