elastic balancer aws http redirect ssl https haproxy

balancer - haproxy redirect http to https



HAProxy redirige http a https(ssl) (11)

Estoy usando HAProxy para equilibrar la carga y solo quiero que mi sitio admita https. Por lo tanto, me gustaría redirigir todas las solicitudes en el puerto 80 al puerto 443.

¿Cómo haría esto?

Editar: nos gustaría redireccionar a la misma url en https, preservando los parámetros de consulta. Por lo tanto, http://foo.com/bar redirigiría a https://foo.com/bar


¿Por qué no usas ACL para distinguir el tráfico? encima de mi cabeza:

acl go_sslwebserver path bar use_backend sslwebserver if go_sslwebserver

Esto va más allá de lo que respondió Matthew Brown.

Consulta los documentos de ha , busca cosas como hdr_dom y más abajo para encontrar más opciones de ACL. Hay muchas opciones.



Como dijo Jay Taylor, HAProxy 1.5-dev tiene la directiva de configuración de redirect scheme , que logra exactamente lo que necesita.

Sin embargo, si no puede usar 1.5, y si no puede compilar HAProxy desde el origen, copié la funcionalidad del redirect scheme para que funcione en 1.4. Puede obtener el parche aquí: http://marc.info/?l=haproxy&m=138456233430692&w=2


De acuerdo con http://parsnips.net/haproxy-http-to-https-redirect/ , debería ser tan fácil como configurar su haproxy.cfg para contener lo siguiente.

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


La mejor manera garantizada para redirigir todo http a https es:

frontend http-in bind *:80 mode http redirect scheme https code 301

Esto es un poco más elegante usando el ''código 301'', pero también podría hacerle saber al cliente que es permanente. La parte ''modo http'' no es esencial con la configuración predeterminada, pero no puede doler. Si tiene mode tcp en la sección de valores predeterminados (como yo), entonces es necesario.


No tengo suficiente reputación para comentar una respuesta anterior, así que estoy publicando una nueva respuesta para complementar la respuesta de Jay Taylor. Básicamente, su respuesta hará la redirección, una redirección implícita, lo que significa que emitirá un 302 (redirección temporal), pero dado que la pregunta informa que todo el sitio web se servirá como https, entonces la redirección apropiada debería ser un 301 (redirección permanente) )

redirect scheme https code 301 if !{ ssl_fc }

Parece un pequeño cambio, pero el impacto puede ser enorme dependiendo del sitio web, con un redireccionamiento permanente. Estamos informando al navegador que ya no debería buscar la versión http desde el comienzo (evitando redirecciones futuras), un ahorro de tiempo para https sitios. También ayuda con SEO, pero no divide el jugo de tus enlaces.


Para redirigir todo el tráfico:

redirect scheme https if !{ ssl_fc }

Para redirigir una sola URL (en caso de múltiples frontend / backend)

redirect scheme https if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }


Si desea reescribir la url, debe cambiar su sitio virtualhost agregando estas líneas:

### Enabling mod_rewrite Options FollowSymLinks RewriteEngine on ### Rewrite http:// => https:// RewriteCond %{SERVER_PORT} 80$ RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,NC,L]

Pero, si desea redirigir todas sus solicitudes en el puerto 80 al puerto 443 de los servidores web detrás del proxy, puede probar este ejemplo conf en su 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

Espero que esto te ayude


Una pequeña variación de la solución de user2966600 ...

Para redirigir todos, excepto una sola URL (en caso de múltiples frontend / backend):

redirect scheme https if !{ hdr(Host) -i www.mydomain.com } !{ ssl_fc }


Encontré que esta es la mayor ayuda :

Use HAProxy 1.5-dev13 o posterior, y simplemente agregue la siguiente línea a la configuración del frontend:

redirect scheme https code 301 if !{ ssl_fc }


frontend unsecured *:80 mode http redirect location https://foo.bar.com