J'utilise HAProxy pour l'équilibrage de charge et je veux seulement que mon site prenne en charge https. Ainsi, je voudrais rediriger toutes les demandes sur le port 80 vers le port 443.
Comment je ferais ça?
Edit: Nous aimerions rediriger vers la même URL sur https, en préservant les paramètres de requête. Ainsi, http://foo.com/bar redirigerait vers https://foo.com/bar
J'ai trouvé que c'était la plus grande aide :
Utilisez HAProxy 1.5-dev13 ou une version plus récente et ajoutez simplement la ligne suivante à la configuration de l'interface:
redirect scheme https code 301 if !{ ssl_fc }
Je n'ai pas assez de réputation pour commenter une réponse précédente, alors je poste une nouvelle réponse pour compléter la réponse de Jay Taylor. Fondamentalement, sa réponse fera la redirection, une redirection implicite cependant, ce qui signifie qu’elle émettra une redirection 302 (temporaire), mais comme la question indique que le site Web entier sera affiché en tant que https, la redirection appropriée doit être une redirection permanente ).
redirect scheme https code 301 if !{ ssl_fc }
Cela semble un petit changement, mais l’impact peut être énorme selon le site. Avec une redirection permanente, nous informons le navigateur qu’il ne devrait plus chercher la version http dès le début (éviter les redirections futures) - un gain de temps pour https des sites. Cela aide également avec le référencement, mais pas en divisant le jus de vos liens.
Pour rediriger tout le trafic:
redirect scheme https if !{ ssl_fc }
Pour rediriger une seule URL (en cas de frontend/backend multiple)
redirect scheme https if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }
Selon http://parsnips.net/haproxy-http-to-https-redirect/ , cela devrait être aussi simple que de configurer votre haproxy.cfg pour qu'il contienne ce qui suit.
#---------------------------------------------------------------------
# Redirect to secured
#---------------------------------------------------------------------
frontend unsecured *:80
redirect location https://foo.bar.com
#---------------------------------------------------------------------
# frontend secured
#---------------------------------------------------------------------
frontend secured *:443
mode tcp
default_backend app
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
mode tcp
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
Le meilleur moyen garanti de tout rediriger http vers https est le suivant:
frontend http-in
bind *:80
mode http
redirect scheme https code 301
C’est un peu plus sophistiqué qui utilise le code 301, mais il est aussi bon de le faire savoir au client. La partie ‘mode http’ n’est pas essentielle avec la configuration par défaut, mais ne peut pas nuire. Si vous avez mode tcp
dans la section des valeurs par défaut (comme je l’ai fait), alors c’est nécessaire.
Une légère variation de la solution de user2966600 ...
Pour rediriger tout sauf une seule URL (en cas de frontend/backend multiple):
redirect scheme https if !{ hdr(Host) -i www.mydomain.com } !{ ssl_fc }
Comme Jay Taylor l'a dit, HAProxy 1.5-dev a la directive de configuration redirect scheme
, qui répond exactement à vos besoins.
Cependant, si vous ne parvenez pas à utiliser la version 1.5 et si vous êtes prêt à compiler HAProxy à partir du code source, je rétorque la fonctionnalité redirect scheme
afin qu'elle fonctionne dans la version 1.4. Vous pouvez obtenir le correctif ici: http://marc.info/?l=haproxy&m=138456233430692&w=2
frontend unsecured *:80
mode http
redirect location https://foo.bar.com
Si vous voulez réécrire l'URL, vous devez changer votre site virtualhost en ajoutant ces lignes:
### Enabling mod_rewrite
Options FollowSymLinks
RewriteEngine on
### Rewrite http:// => https://
RewriteCond %{SERVER_PORT} 80$
RewriteRule ^(.*)$ https://%{HTTP_Host}$1 [R=301,NC,L]
Toutefois, si vous souhaitez rediriger toutes vos demandes sur le port 80 vers le port 443 des serveurs Web situés derrière le proxy, vous pouvez essayer ceci example conf sur votre haproxy.cfg:
##########
# Global #
##########
global
maxconn 100
spread-checks 50
daemon
nbproc 4
############
# Defaults #
############
defaults
maxconn 100
log global
mode http
option dontlognull
retries 3
contimeout 60000
clitimeout 60000
srvtimeout 60000
#####################
# Frontend: HTTP-IN #
#####################
frontend http-in
bind *:80
option logasap
option httplog
option httpclose
log global
default_backend sslwebserver
#########################
# Backend: SSLWEBSERVER #
#########################
backend sslwebserver
option httplog
option forwardfor
option abortonclose
log global
balance roundrobin
# Server List
server sslws01 webserver01:443 check
server sslws02 webserver02:443 check
server sslws03 webserver03:443 check
J'espère que cela vous aide
Ajoutez ceci dans la configuration HAProxy Frontend:
acl http ssl_fc,not
http-request redirect scheme https if http
Pourquoi n'utilisez-vous pas les ACL pour distinguer le trafic? sur le dessus de ma tête:
acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver
Cela va au-delà de ce que Matthew Brown a répondu.
Consultez la documentation ha , recherchez des éléments tels que hdr_dom et ci-dessous pour rechercher plus d'options ACL. Il y a beaucoup de choix.