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.
Agregue esto a la configuración del frontend de HAProxy:
acl http ssl_fc,not
http-request redirect scheme https if http
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