J'ai récemment migré mes sites Web vers un environnement entièrement Docker utilisant haproxy comme équilibreur de charge frontal. J'ai des certificats SSL pour tous les domaines émis par Let's Encrypt et tout fonctionne très bien. Lorsque j'active CloudFlare, tout se rompt dans une boucle de redirection infinie.
J'ai lu quelques articles disant que l'utilisation de SSL intégral ou strict sur CloudFlare résoudrait le problème, mais que le chargement de CSS, de JS et des images échouait.
Laisser CloudFlare désactivé et utiliser uniquement le DNS qu'ils fournissent est la seule option que j'ai trouvée où tout fonctionne. Ce n'est pas idéal, parce que la raison pour laquelle j'ai voulu utiliser Cloudflare était, à cause de Cloudflare.
J'ai actuellement 2 sites hébergés sur mon serveur: ma page de biographie de base et un site sur lequel je travaille pour une collecte de fonds par une église locale.
Je ne suis pas sûr de ce que j'ai fait sur le site de collecte de fonds, mais cela ne fonctionne plus du tout, même après avoir désactivé tout Cloudflare. C'est coincé dans une boucle infinie en ce moment. La bonne nouvelle est que je viens tout juste de commencer et que je peux reprendre si nécessaire. Ce qui est stupide, c’est que le temps que j’ai pris pour écrire ce message a été corrigé. Peut-être en raison de diverses caches ??
bkvaluemeal.net ma page de biographie de base, est une personnalisation PHP que j'ai écrite et hébergée dans un conteneur NGINX
theresianbazaar.tk la collecte de fonds par l’église est un simple et simple conteneur Word Press
Ils sont tous liés avec un conteneur haproxy
global
daemon
maxconn 100
pidfile /var/run/haproxy.pid
stats socket /var/run/haproxy.stat mode 600
tune.ssl.default-dh-param 4096
defaults
mode http
maxconn 50
timeout client 60s
timeout server 60s
timeout queue 60s
timeout connect 4s
timeout http-request 5s
option httpclose
option abortonclose
option http-server-close
balance roundrobin
option forwardfor
retries 2
frontend http
bind *:80
reqadd X-Forwarded-Proto:\ http
redirect scheme https code 301 if !{ ssl_fc }
acl Host_haproxy hdr_beg(Host) -i haproxy.
acl Host_bkvaluemeal hdr(Host) -i www.bkvaluemeal.net
acl Host_bkvaluemeal hdr(Host) -i bkvaluemeal.net
acl Host_theresianbazaar hdr(Host) -i www.theresianbazaar.tk
acl Host_theresianbazaar hdr(Host) -i theresianbazaar.tk
acl letsencrypt path_beg -i /.well-known/acme-challenge/
use_backend haproxy if Host_haproxy
use_backend bkvaluemeal if Host_bkvaluemeal
use_backend bkvaluemeal if Host_bkvaluemeal letsencrypt
use_backend bkvaluemeal if Host_haproxy Host_bkvaluemeal letsencrypt
use_backend theresianbazaar if Host_theresianbazaar
use_backend theresianbazaar if Host_theresianbazaar letsencrypt
default_backend haproxy
frontend https
bind *:443 ssl crt /ssl
reqadd X-Forwarded-Proto:\ https
acl Host_haproxy hdr_beg(Host) -i haproxy.
acl Host_bkvaluemeal hdr(Host) -i www.bkvaluemeal.net
acl Host_bkvaluemeal hdr(Host) -i bkvaluemeal.net
acl Host_theresianbazaar hdr(Host) -i www.theresianbazaar.tk
acl Host_theresianbazaar hdr(Host) -i theresianbazaar.tk
acl letsencrypt path_beg -i /.well-known/acme-challenge/
use_backend haproxy if Host_haproxy
use_backend bkvaluemeal if Host_bkvaluemeal
use_backend bkvaluemeal if Host_bkvaluemeal letsencrypt
use_backend bkvaluemeal if Host_haproxy Host_bkvaluemeal letsencrypt
use_backend theresianbazaar if Host_theresianbazaar
use_backend theresianbazaar if Host_theresianbazaar letsencrypt
default_backend haproxy
backend bkvaluemeal
server bkvaluemeal bkvaluemeal:80 check
backend theresianbazaar
server theresianbazaar theresianbazaar:80 check
backend haproxy
stats enable
stats hide-version
stats uri /
server {
server_name bkvaluemeal.net www.bkvaluemeal.net;
root /www;
index index.php;
location / {
try_files $uri $uri/ = 404;
}
location ~ /(includes|lib|res|.htpasswd) {
deny all;
return 404;
}
location ^~ /admin/ {
try_files $uri $uri/ = 404;
auth_basic 'Restricted Content';
auth_basic_user_file /www/.htpasswd;
}
location ~ \.php$ {
try_files $uri = 404;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/bkvaluemeal/$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $document_root/bkvaluemeal;
}
}
J'espère ne pas révéler d'informations critiques sur ma configuration au point de me faire pirater ...
Actuellement, CloudFlare est désactivé pour les deux sites et ils agissent uniquement en tant que DNS. J'aimerais pouvoir utiliser CloudFlare dans son intégralité pour les deux sites sans éprouver de boucle de redirection infinie.
Comme suggéré par @ Jules , j'ai supprimé la redirection dans haproxy et activé le SSL Full (Strict) de CloudFlare sur les deux sites. Mon site personnel fonctionne très bien, mais le site promotionnel est maintenant bloqué dans une boucle infinie. Le page de statistiques pour haproxy n'a montré aucune demande depuis que j'ai apporté les modifications, mais a récemment augmenté jusqu'à deux.
J'ai décidé d'essayer la page de connexion Word Press. Bien que la connexion ait échoué, ma pile Docker Compose a enregistré 21 demandes. Le premier était un 301 et les 20 autres, un 302. Toutes les demandes futures adressées à cette URL entraînent 21 302 réponses supplémentaires.
J'ai utilisé curl pour cartographier la folie qui se passe ici. Je l'ai posté sur Pastebin pour plus de concision. httpshttp
CloudFlare est désactivé pour le site promotionnel dès maintenant. Le site est servi directement à partir de mon serveur.
Wordpress est le coupable typique de ces boucles de redirection. Assurez-vous qu'il est configuré en tant que site https, sinon wp redirigera indéfiniment vers http et cloudflare.