web-dev-qa-db-fra.com

Cloudflare infinie redirect

Contexte

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 ??

Format

  • 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

Configuration

haproxy.cfg

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 /

bkvaluemeal.net NGINX default.conf

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 ...

Objectif

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.

Mises à jour

  • 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.

3
bkvaluemeal

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.

1
Jules