Ich verwende HAProxy für den Lastausgleich 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 dieselbe URL umleiten, wobei die Abfrageparameter erhalten bleiben. Daher würde http://foo.com/bar zu https://foo.com/bar umleiten.
Ich habe festgestellt, dass dies die größte Hilfe ist :
Verwenden Sie HAProxy 1.5-dev13 oder neuer und fügen Sie der Frontend-Konfiguration einfach die folgende Zeile hinzu:
redirect scheme https code 301 if !{ ssl_fc }
Ich habe nicht genug Ruf, um eine vorherige Antwort zu kommentieren. Deshalb werde ich eine neue Antwort posten, um die Antwort von Jay Taylor zu ergänzen. Im Wesentlichen wird seine Antwort die Weiterleitung durchführen, eine implizite Weiterleitung, was bedeutet, dass eine 302 (temporäre Weiterleitung) ausgegeben wird. Da die Frage jedoch darauf hinweist, 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, die Auswirkungen können jedoch je nach Website sehr groß sein. Mit einer permanenten Weiterleitung informieren wir den Browser, dass er von Anfang an nicht mehr nach der http-Version suchen sollte (zukünftige Weiterleitungen vermeiden) - eine Zeitersparnis für https Websites. Es hilft auch bei SEO, teilt aber nicht den Saft Ihrer Links.
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 }
Gemäß http://parsnips.net/haproxy-http-to-https-redirect/ sollte es so einfach sein wie das Konfigurieren Ihrer haproxy.cfg, um Folgendes zu enthalten.
#---------------------------------------------------------------------
# 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
Der beste garantierte Weg, alles http zu https umzuleiten, ist:
frontend http-in
bind *:80
mode http
redirect scheme https code 301
Dies ist ein wenig schicker mit dem Code 301, kann aber auch den Kunden wissen lassen, dass es permanent ist. Der Teil "mode http" ist bei der Standardkonfiguration nicht unbedingt erforderlich, kann jedoch nicht schaden. Wenn Sie mode tcp
in der Standardeinstellung haben (wie ich es getan habe), ist es notwendig.
Eine kleine Variante der Lösung von user2966600 ...
So leiten Sie alle außer eine einzige URL (bei mehreren Frontends/Backends) um:
redirect scheme https if !{ hdr(Host) -i www.mydomain.com } !{ ssl_fc }
Wie Jay Taylor bereits sagte, verfügt HAProxy 1.5-dev über die Konfigurationsanweisung redirect scheme
, die genau das ausführt, was Sie benötigen.
Wenn Sie jedoch nicht 1.5 verwenden können und HAProxy aus dem Quellcode kompilieren können, habe ich die redirect scheme
-Funktionalität zurückportiert, sodass sie in 1.4 funktioniert. Den Patch erhalten Sie hier: http://marc.info/?l=haproxy&m=138456233430692&w=2
frontend unsecured *:80
mode http
redirect location https://foo.bar.com
Wenn Sie die URL neu schreiben möchten, müssen Sie den virtuellen Host der Site ändern, indem Sie 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 example conf auf Ihrer haproxy.cfg versuchen:
##########
# 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
Fügen Sie dies in die HAProxy-Frontend-Konfiguration ein:
acl http ssl_fc,not
http-request redirect scheme https if http
Warum verwenden Sie keine ACLs, um den Verkehr zu unterscheiden? auf meinem Kopf:
acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver
Das geht über das, was Matthew Brown antwortete.
In den ha-Dokumenten können Sie nach Optionen wie hdr_dom und unten suchen, um weitere ACL-Optionen zu finden. Es gibt viele Möglichkeiten.