HAProxy reindirizza da http a https (ssl)


99

Utilizzo HAProxy per il bilanciamento del carico e desidero solo che il mio sito supporti https. Pertanto, vorrei reindirizzare tutte le richieste sulla porta 80 alla porta 443.

Come lo farei?

Modifica: vorremmo reindirizzare allo stesso URL su https, preservando i parametri della query. Pertanto, http://foo.com/bar reindirizzerà a https://foo.com/bar

Risposte:


137

Ho trovato questo il più grande aiuto :

Usa HAProxy 1.5 o più recente e aggiungi semplicemente la seguente riga alla configurazione del frontend:

redirect scheme https code 301 if !{ ssl_fc }

20
Per aggiungere a questo, dalla risposta di User2966600 di seguito, con 301 aggiunto, utilizzare questo per reindirizzare a https solo per un dominio specifico:redirect scheme https code 301 if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }
Quentin Skousen

1
Ha funzionato. Anche se non funziona senza il "codice 301". Grazie per l'aggiornamento.
deej

6
Una sintassi equivalente alla risposta data sarebbe come questo: http-request redirect scheme https code 301 if !{ ssl_fc }. La documentazione per il reindirizzamento http in ALOHA HAProxy 7.0 menziona anche che " la sintassi di entrambe le direttive è la stessa, detto questo, il reindirizzamento è ora considerato come legacy e le configurazioni dovrebbero spostarsi nel modulo di reindirizzamento della richiesta http ". Ne deduco, senza esserne completamente sicuro, che la stessa spiegazione si applica alle versioni più recenti della versione open source di HAProxy.
rodolfojcj

Grazie per la tua risposta. Potresti espandere per spiegare dove dobbiamo aggiungere questa riga? Nel frontend / backend / default / global / ..?
realtebo

Di solito lo posiziono all'interno del frontend, ma i reindirizzamenti sono solo un'intestazione, quindi mi aspetto che un reindirizzamento possa essere attivato fino a quando non vengono inviate le intestazioni di risposta. Mi piacerebbe sapere se può funzionare in entrambe le posizioni, potrebbe essere necessario provarlo.
Jay Taylor

68

Non ho abbastanza reputazione per commentare una risposta precedente, quindi sto postando una nuova risposta per completare la risposta di Jay Taylor. Fondamentalmente la sua risposta farà il reindirizzamento, un reindirizzamento implicito, il che significa che emetterà un 302 (reindirizzamento temporaneo), ma poiché la domanda informa che l'intero sito web sarà servito come https, il reindirizzamento appropriato dovrebbe essere un 301 (reindirizzamento permanente ).

redirect scheme https code 301 if !{ ssl_fc }

Sembra un piccolo cambiamento, ma l'impatto potrebbe essere enorme a seconda del sito web, con un reindirizzamento permanente informiamo il browser che non dovrebbe più cercare la versione http dall'inizio (evitando reindirizzamenti futuri) - un risparmio di tempo per https siti. Aiuta anche con la SEO, ma non divide il succo dei tuoi link.


41

Per reindirizzare tutto il traffico:

redirect scheme https if !{ ssl_fc }

Per reindirizzare un singolo URL (in caso di più frontend / backend)

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


1
Grazie, la condizione "solo su un host specifico" era proprio quello che stavo cercando!
Quentin Skousen

Potresti mostrare un esempio pratico della seconda opzione, per favore?
RicarHincapie

16

Secondo http://parsnips.net/haproxy-http-to-https-redirect/ dovrebbe essere facile come configurare il tuo haproxy.cfg per contenere quanto segue.

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

7
Quindi reindirizzerebbe tutto a foo.bar.com . Idealmente, però, vorremmo che foo.bar.com/baz reindirizzasse a foo.bar.com/baz . Abbiamo anche bisogno di parametri di query.
Jon Chu

@JonChu solleva un caso d'uso valido, questa è solo una soluzione parziale.
Jay Taylor

3
Invece di utilizzare la posizione di reindirizzamento, prova invece il prefisso di reindirizzamento https: //foo.bar.com. Dovrebbe aiutare con il caso d'uso menzionato da Jon Chu.
xangxiong

16

Il modo migliore garantito per reindirizzare tutto da http a https è:

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

Questo è un po 'più elaborato usando il' codice 301 ', ma potrebbe anche far sapere al cliente che è permanente. La parte "modalità http" non è essenziale con la configurazione predefinita, ma non può far male. Se hai mode tcpnella sezione dei valori predefiniti (come ho fatto io), allora è necessario.


10

Una leggera variazione della soluzione di user2966600 ...

Per reindirizzare tutto tranne un singolo URL (in caso di più frontend / backend):

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

4

Come ha detto Jay Taylor, HAProxy 1.5-dev ha la redirect schemedirettiva di configurazione, che realizza esattamente ciò di cui hai bisogno.

Tuttavia, se non sei in grado di utilizzare 1.5 e se sei pronto per compilare HAProxy dal sorgente, ho eseguito il backport della redirect schemefunzionalità in modo che funzioni nella 1.4. Puoi ottenere la patch qui: http://marc.info/?l=haproxy&m=138456233430692&w=2


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

1

Nelle versioni più recenti di HAProxy si consiglia di utilizzare

http-request redirect scheme https if !{ ssl_fc }

per reindirizzare il traffico http a https.


0

Se vuoi riscrivere l'URL, devi cambiare il tuo sito virtualhost aggiungendo queste righe:

### Enabling mod_rewrite
Options FollowSymLinks
RewriteEngine on

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

Ma, se vuoi reindirizzare tutte le tue richieste sulla porta 80 alla porta 443 dei server web dietro il proxy, puoi provare questo esempio conf sul tuo 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

Spero che questo ti sia d'aiuto


0

Perché non usi gli ACL per distinguere il traffico? in cima alla mia testa:

acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver

Questo va oltre a ciò che ha risposto Matthew Brown.

Consulta i documenti ha , cerca cose come hdr_dom e sotto per trovare altre opzioni ACL. Ci sono molte scelte.



0

Può essere fatto in questo modo -

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

Qualsiasi traffico che colpisce http verrà reindirizzato a https


0

l' istruzione di reindirizzamento è eredità

usa invece il reindirizzamento della richiesta http

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

0

Semplicemente:

frontend incoming_requsts
        bind *:80
        bind *:443 ssl crt *path_to_cert*.**pem**
        **http-request redirect scheme https unless { ssl_fc }**
        default_backend k8s_nodes
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.