web-dev-qa-db-fra.com

HAProxy redirige http en https (ssl)

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

79
Jon Chu

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 }
118
Jay Taylor

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.

61
Marcos Abreu

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 }

37
user2966600

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
14
Matthew Brown

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.

10
Maitreya

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 }
9
Josh Currier

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

4
rusty
frontend unsecured *:80
    mode http
    redirect location https://foo.bar.com
2
sanyi

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

0
Flat

Ajoutez ceci dans la configuration HAProxy Frontend:

acl http      ssl_fc,not
http-request redirect scheme https if http

HAProxy - Redirection de requêtes HTTP

0
Nick Tsai

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.

0
Glenn Plas