HAProxy leitet http zu https (ssl) um

98

Ich verwende HAProxy für den Lastenausgleich und möchte nur, dass meine Website https unterstützt. Daher möchte ich alle Anforderungen an Port 80 an Port 443 umleiten.

Wie würde ich das machen?

Bearbeiten: Wir möchten auf https zur gleichen URL umleiten, wobei die Abfrageparameter beibehalten werden. Daher würde http://foo.com/bar zu https://foo.com/bar umleiten

Jon Chu
quelle

Antworten:

137

Ich fand das die größte Hilfe :

Verwenden Sie HAProxy 1.5 oder neuer und fügen Sie der Frontend-Konfiguration einfach die folgende Zeile hinzu:

redirect scheme https code 301 if !{ ssl_fc }
Jay Taylor
quelle
20
Um dies hinzuzufügen, verwenden Sie dies aus der Antwort von User2966600 unten, wobei 301 hinzugefügt wurde, um nur für eine bestimmte Domain zu https umzuleiten:redirect scheme https code 301 if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }
Quentin Skousen
1
Das hat funktioniert. Obwohl es ohne 'Code 301' nicht funktioniert. Danke für Update.
DJ
6
Eine äquivalente Syntax zu der gegebenen Antwort wäre wie folgt : http-request redirect scheme https code 301 if !{ ssl_fc }. In der Dokumentation zur http-Umleitung in ALOHA HAProxy 7.0 wird sogar erwähnt, dass " die Syntax beider Anweisungen dieselbe ist, dh, die Umleitung wird jetzt als Legacy betrachtet und Konfigurationen sollten in das http-Anforderungsumleitungsformular verschoben werden ". Ich schließe, ohne ganz sicher zu sein, dass die gleiche Erklärung für die neueren Versionen der Open-Source-Version von HAProxy gilt.
Rodolfojcj
Danke für deine Antwort. Könnten Sie erweitern, um zu erklären, wo wir diese Zeile hinzufügen müssen? Im Frontend / Backend / default / global / ..?
Realtebo
Normalerweise platziere ich es im Frontend, aber Weiterleitungen sind nur ein Header. Daher würde ich erwarten, dass eine Umleitung ausgelöst werden kann, bis die Antwortheader gesendet wurden. Ich würde gerne wissen, ob es an beiden Standorten funktioniert, muss es vielleicht versuchen.
Jay Taylor
68

Ich habe nicht genug Ruf, um eine frühere Antwort zu kommentieren, daher veröffentliche ich eine neue Antwort, um Jay Taylors Antwort zu ergänzen. Grundsätzlich führt seine Antwort die Weiterleitung durch, eine implizite Weiterleitung, was bedeutet, dass eine 302 (temporäre Weiterleitung) ausgegeben wird. Da die Frage jedoch angibt, dass die gesamte Website als https bereitgestellt wird, sollte die entsprechende Weiterleitung eine 301 (permanente Weiterleitung) sein ).

redirect scheme https code 301 if !{ ssl_fc }

Es scheint eine kleine Änderung zu sein, aber die Auswirkungen können je nach Website enorm sein. Mit einer permanenten Weiterleitung informieren wir den Browser, dass er nicht mehr von Anfang an nach der http-Version suchen sollte (um zukünftige Weiterleitungen zu vermeiden) - eine Zeitersparnis für https Websites. Es hilft auch bei der Suchmaschinenoptimierung, teilt aber nicht den Saft Ihrer Links.

Marcos Abreu
quelle
40

So leiten Sie den gesamten Datenverkehr um:

redirect scheme https if !{ ssl_fc }

So leiten Sie eine einzelne URL um (bei mehreren Frontends / Backends)

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

user2966600
quelle
1
Vielen Dank, die Bedingung "nur auf einem bestimmten Host" war genau das, wonach ich gesucht habe!
Quentin Skousen
16

Laut http://parsnips.net/haproxy-http-to-https-redirect/ sollte es so einfach sein, Ihre haproxy.cfg so zu konfigurieren, dass sie Folgendes enthält.

#---------------------------------------------------------------------
# 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
Matthew Brown
quelle
7
Das würde also alles auf foo.bar.com umleiten . Im Idealfall allerdings möchten wir foo.bar.com/baz umleiten foo.bar.com/baz . Wir brauchen auch Abfrageparameter.
Jon Chu
@ JonChu wirft einen gültigen Anwendungsfall auf, dies ist nur eine Teillösung.
Jay Taylor
3
Versuchen Sie stattdessen, das Umleitungspräfix https: //foo.bar.com zu verwenden, anstatt den Umleitungsort zu verwenden. Es sollte bei dem Anwendungsfall helfen, den Jon Chu erwähnt.
Xangxiong
16

Der beste garantierte Weg, um alles http zu https umzuleiten, ist:

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

Mit 'Code 301' ist dies etwas ausgefallener, aber Sie können den Kunden auch darüber informieren, dass es permanent ist. Der Teil 'mode http' ist bei der Standardkonfiguration nicht unbedingt erforderlich, kann aber nicht schaden. Wenn Sie mode tcpim Standardbereich (wie ich) haben, dann ist es notwendig.

Maitreya
quelle
10

Eine leichte Variation der Lösung von user2966600 ...

So leiten Sie alle außer einer einzelnen URL um (bei mehreren Frontends / Backends):

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

Wie Jay Taylor sagte, hat HAProxy 1.5-dev die redirect schemeKonfigurationsanweisung, die genau das erfüllt, was Sie brauchen.

Wenn Sie jedoch 1.5 nicht verwenden können und HAProxy aus dem Quellcode kompilieren möchten, habe ich die redirect schemeFunktionalität zurückportiert , damit sie in 1.4 funktioniert. Sie können den Patch hier herunterladen : http://marc.info/?l=haproxy&m=138456233430692&w=2

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

In neueren Versionen von HAProxy wird die Verwendung empfohlen

http-request redirect scheme https if !{ ssl_fc }

um den http-Verkehr auf https umzuleiten.

Dieser Typ
quelle
0

Wenn Sie die URL neu schreiben möchten, müssen Sie den virtuellen Host Ihrer Site ändern und folgende Zeilen hinzufügen:

### Enabling mod_rewrite
Options FollowSymLinks
RewriteEngine on

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

Wenn Sie jedoch alle Ihre Anforderungen an Port 80 an Port 443 der Webserver hinter dem Proxy umleiten möchten , können Sie dieses Beispiel conf auf Ihrer haproxy.cfg ausprobieren:

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

Ich hoffe das hilft dir

Eben
quelle
0

Warum verwenden Sie keine ACLs, um den Datenverkehr zu unterscheiden? auf meinem Kopf:

acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver

Dies geht über das hinaus, was Matthew Brown geantwortet hat.

Sehen Sie sich die ha-Dokumente an , suchen Sie nach Dingen wie hdr_dom und unten, um weitere ACL-Optionen zu finden. Es gibt viele Möglichkeiten.

Glenn Plas
quelle
0

Fügen Sie dies in die HAProxy-Frontend-Konfiguration ein:

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

HAProxy - HTTP-Anfragen umleiten

Nick Tsai
quelle
0

Kann so gemacht werden -

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

Jeder Datenverkehr, der auf http trifft, wird zu https umgeleitet

Chandan
quelle
0

Redirect- Anweisung ist Vermächtnis

Verwenden Sie stattdessen die http-Request-Umleitung

acl http      ssl_fc,not
http-request redirect scheme https if http
1AmirJalali
quelle