HAProxy, http'yi https'ye (ssl) yönlendiriyor


100

Yük dengeleme için HAProxy kullanıyorum ve yalnızca sitemin https'yi desteklemesini istiyorum. Bu nedenle, 80 numaralı bağlantı noktasındaki tüm istekleri 443 numaralı bağlantı noktasına yeniden yönlendirmek istiyorum.

Bunu nasıl yaparım?

Düzenleme: Sorgu parametrelerini koruyarak https üzerindeki aynı url'ye yeniden yönlendirmek istiyoruz. Böylece, http://foo.com/bar https://foo.com/bar'a yönlendirir

Yanıtlar:


143

Bunu en büyük yardım olarak buldum :

HAProxy 1.5 veya daha yenisini kullanın ve aşağıdaki satırı ön uç yapılandırmasına ekleyin:

redirect scheme https code 301 if !{ ssl_fc }

20
Buna eklemek için, 301 eklenmiş aşağıdaki Kullanıcı2966600 yanıtından, bunu yalnızca belirli bir alan adı için https'ye yönlendirmek için kullanın:redirect scheme https code 301 if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }
Quentin Skousen

1
İşe yaradı. 'Kod 301' olmadan çalışmasa da. Güncelleme için teşekkürler.
deej

7
Bu sorunun yanıtına eşdeğer sözdizimi şu şekilde olacaktır: http-request redirect scheme https code 301 if !{ ssl_fc }. ALOHA HAProxy 7.0'daki http yeniden yönlendirme dokümantasyonu , " her iki direktifin sözdiziminin aynı olduğundan, yeniden yönlendirmenin artık eski olarak kabul edildiğini ve yapılandırmaların http-istek yeniden yönlendirme formuna taşınması gerektiğini" belirtmektedir . Tamamen emin olmadan, aynı açıklamanın HAProxy'nin açık kaynak sürümünün yeni sürümleri için de geçerli olduğunu anladım.
rodolfojcj

Cevabın için teşekkürler. Bu satırı nereye eklememiz gerektiğini açıklayabilir misiniz? Ön uçta / arka uçta / varsayılan / genel / ..'de?
realtebo

1
Bunun ayrı bir ön uç bloğunda olması gerektiğine dikkat etmek önemlidir. Birçok çevrimiçi örnek kod, aynı blokta her iki bağa da sahiptir ve çift bağlantılı bir blokta yeniden yönlendirme yapmak haproxy'nin başlamasını engeller.
Sami Fouad

68

Önceki bir cevaba yorum yapacak kadar itibarım yok, bu yüzden Jay Taylor'ın cevabını tamamlamak için yeni bir cevap gönderiyorum. Temelde cevabı yönlendirmeyi yapacak, örtük bir yönlendirme, yani bir 302 (geçici yeniden yönlendirme) yayınlayacak, ancak soru tüm web sitesinin https olarak sunulacağını bildirdiği için, uygun yönlendirme bir 301 (kalıcı yeniden yönlendirme) olmalıdır. ).

redirect scheme https code 301 if !{ ssl_fc }

Küçük bir değişiklik gibi görünüyor, ancak etki web sitesine bağlı olarak çok büyük olabilir, kalıcı bir yeniden yönlendirme ile tarayıcıya artık baştan itibaren http sürümünü aramaması gerektiğini bildiriyoruz (gelecekteki yönlendirmelerden kaçınarak) - https için bir zaman tasarrufu Siteler. Aynı zamanda SEO'ya da yardımcı olur, ancak bağlantılarınızın özünü bölmez.


42

Tüm trafiği yeniden yönlendirmek için:

redirect scheme https if !{ ssl_fc }

Tek bir url'yi yeniden yönlendirmek için (Birden fazla ön uç / arka uç olması durumunda)

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


1
Teşekkürler, "yalnızca belirli bir ana bilgisayarda" koşulu tam da aradığım şeydi!
Quentin Skousen

İkinci seçeneğin pratik bir örneğini gösterir misiniz lütfen?
RicarHincapie

16

Http ile her şeyi https'ye yönlendirmenin en garantili yolu şudur:

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

Bu, 'kod 301'i kullanan biraz meraklısıdır, ancak müşterinin kalıcı olduğunu bilmesini sağlayabilir. Varsayılan yapılandırmada 'mod http' kısmı gerekli değildir, ancak zarar veremez. Eğer varsa mode tcp(benim yaptığım gibi) defaults bölümünde, daha sonra bu gerekli.


15

Http://parsnips.net/haproxy-http-to-https-redirect/ 'e göre , haproxy.cfg'nizi aşağıdakileri içerecek şekilde yapılandırmak kadar kolay olmalıdır.

#---------------------------------------------------------------------
# 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
Böylece her şey foo.bar.com'a yönlendirilirdi . İdeal olsa, biz gibi olur foo.bar.com/baz yönlendirmek için foo.bar.com/baz . Ayrıca sorgu parametrelerine de ihtiyacımız var.
Jon Chu

@JonChu geçerli bir kullanım durumu ortaya çıkarır, bu yalnızca kısmi bir çözümdür.
Jay Taylor

3
Yönlendirme konumunu kullanmak yerine, bunun yerine https: //foo.bar.com önekini yeniden yönlendirmeyi deneyin. Jon Chu'nun bahsettiği kullanım senaryosuna yardımcı olmalı.
xangxiong

10

User2966600'ün çözümünün küçük bir varyasyonu ...

Tek bir URL dışında tümünü yeniden yönlendirmek için (Birden çok ön uç / arka uç olması durumunda):

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

4

Jay Taylor'ın dediği gibi, HAProxy 1.5-dev, redirect schemetam olarak ihtiyacınız olanı gerçekleştiren yapılandırma yönergesine sahiptir .

Bununla birlikte, 1.5'i kullanamıyorsanız ve HAProxy'yi kaynaktan derlemeye hazırsanız, 1.4'te redirect schemeçalışması için işlevselliği destekledim. Yamayı buradan edinebilirsiniz: http://marc.info/?l=haproxy&m=138456233430692&w=2


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

1

HAProxy'nin daha yeni sürümlerinde kullanılması tavsiye edilir

http-request redirect scheme https if !{ ssl_fc }

http trafiğini https'ye yönlendirmek için.


1

yönlendirme ifadesi eski

kullanmak http istek yönlendirme yerine

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

0

URL'yi yeniden yazmak istiyorsanız, bu satırları ekleyerek site sanal ana makinenizi değiştirmeniz gerekir:

### Enabling mod_rewrite
Options FollowSymLinks
RewriteEngine on

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

Ancak, 80 numaralı bağlantı noktasındaki tüm taleplerinizi proxy'nin arkasındaki web sunucularının 443 numaralı bağlantı noktasına yönlendirmek istiyorsanız , haproxy.cfg'nizde bu örneği yapılandırmayı deneyebilirsiniz:

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

Umarım bu sana yardımcı olur


0

Trafiği ayırt etmek için neden ACL'leri kullanmıyorsunuz? başımın üstünde:

acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver

Bu, Matthew Brown'un yanıtladığı şeyin üstüne gidiyor.

Daha fazla ACL seçeneği bulmak için ha belgelerine bakın, hdr_dom gibi şeyleri arayın. Bol seçenek var.



0

Böyle yapılabilir -

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

Http'ye isabet eden herhangi bir trafik https'ye yönlendirecektir


0

Basitçe:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.