HAProxy перенаправляє http на https (ssl)


99

Я використовую HAProxy для балансування навантаження і хочу лише, щоб мій сайт підтримував https. Таким чином, я хотів би перенаправити всі запити через порт 80 на порт 443.

Як би я це зробив?

Редагувати: ми хотіли б перенаправити на ту саму URL-адресу на https, зберігаючи параметри запиту. Таким чином, http://foo.com/bar переспрямовуватиме на https://foo.com/bar

Відповіді:


137

Я виявив, що це найбільша допомога :

Використовуйте HAProxy 1.5 або новішу версію та просто додайте наступний рядок до конфігурації інтерфейсу:

redirect scheme https code 301 if !{ ssl_fc }

20
Щоб додати до цього, з відповіді User2966600 нижче, додавши 301, використовуйте це для перенаправлення на https лише для певного домену:redirect scheme https code 301 if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }
Квентін Скузен

1
Це спрацювало. Хоча це не працює без "коду 301". Дякуємо за оновлення.
deej

7
Еквівалентний синтаксис для даної відповіді буде виглядати так: http-request redirect scheme https code 301 if !{ ssl_fc }. У документації щодо перенаправлення http в ALOHA HAProxy 7.0 навіть згадується, що " синтаксис обох директив однаковий, сказано, що перенаправлення тепер розглядається як застаріле, а конфігурації повинні перейти до форми перенаправлення http-запиту ". Я не повністю впевнений, що те саме пояснення стосується і нових версій версії HAProxy з відкритим кодом.
rodolfojcj

Спасибі за Вашу відповідь. Не могли б ви розширити текст, щоб пояснити, куди ми повинні додати цей рядок? У інтерфейсі / бекенді / за замовчуванням / глобальному / ..?
realtebo

Зазвичай я розміщую його всередині інтерфейсу, але переспрямування - це лише заголовок, тому я сподіваюся, що переспрямування може запускатися, поки заголовки відповідей не будуть надіслані. Я хотів би знати, чи може він працювати в обох місцях, можливо, доведеться спробувати.
Джей Тейлор,

68

У мене недостатньо репутації, щоб коментувати попередню відповідь, тому я публікую нову відповідь, щоб доповнити відповідь Джея Тейлора. В основному його відповідь буде робити переспрямування, хоч і неявне перенаправлення, що означає, що він видасть 302 (тимчасове перенаправлення), але оскільки питання інформує, що весь веб-сайт буде обслуговуватися як https, то відповідним переспрямуванням має бути 301 (постійне перенаправлення ).

redirect scheme https code 301 if !{ ssl_fc }

Це здається невеликою зміною, але вплив може бути величезним залежно від веб-сайту, завдяки постійному перенаправленню ми повідомляємо браузеру, що він більше не повинен шукати версію http з самого початку (уникаючи майбутніх переадресацій) - економія часу для https сайтів. Це також допомагає з SEO, але не розділяючи сік ваших посилань.


41

Щоб перенаправити весь трафік:

redirect scheme https if !{ ssl_fc }

Перенаправити одну URL-адресу (у випадку кількох інтерфейсів / серверних даних)

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


1
Дякую, умова "лише на певному хості" - це саме те, що я шукав!
Квентін Скузен

Будь ласка, покажіть, будь ласка, практичний приклад другого варіанту?
RicarHincapie

16

Відповідно до http://parsnips.net/haproxy-http-to-https-redirect/, це повинно бути настільки ж простим, як і налаштування вашого haproxy.cfg, щоб містити наступне.

#---------------------------------------------------------------------
# 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
Тож це перенаправило б усе на foo.bar.com . Хоча в ідеалі ми хотіли б, щоб foo.bar.com/baz переспрямовував на foo.bar.com/baz . Нам також потрібні параметри запиту.
Джон Чу

@JonChu порушує дійсний варіант використання, це лише часткове рішення.
Джей Тейлор,

3
Замість того, щоб використовувати місце переспрямування, спробуйте замість цього зробити префікс https: //foo.bar.com. Це має допомогти у випадку використання, про який згадує Джон Чу.
xangxiong

16

Найкращий гарантований спосіб перенаправити все http на https:

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

Це трохи любитель, використовуючи "код 301", але також міг би повідомити клієнту, що він постійний. Частина "режим http" не є важливою для конфігурації за замовчуванням, але не може зашкодити. Якщо у вас є mode tcpрозділ за замовчуванням (як я це зробив), тоді це потрібно.


10

Невелика варіація рішення користувача2966600 ...

Щоб перенаправити всі, крім однієї URL-адреси (у випадку кількох інтерфейсів / серверних даних):

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

4

Як сказав Джей Тейлор, HAProxy 1.5-dev має redirect scheme директиву конфігурацію, яка виконує саме те, що вам потрібно.

Однак, якщо ви не можете використовувати 1.5, і якщо ви готові до компіляції HAProxy з джерела, я підтримав redirect schemeфункціонал, тому він працює в 1.4. Ви можете отримати патч тут: http://marc.info/?l=haproxy&m=138456233430692&w=2



1

У новіших версіях HAProxy рекомендується використовувати

http-request redirect scheme https if !{ ssl_fc }

для перенаправлення трафіку http на https.


0

Якщо ви хочете переписати URL-адресу, вам потрібно змінити virtualhost вашого сайту, додавши такі рядки:

### Enabling mod_rewrite
Options FollowSymLinks
RewriteEngine on

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

Але якщо ви хочете перенаправити всі свої запити через порт 80 на порт 443 веб-серверів за проксі-сервером, ви можете спробувати цей приклад conf на вашому 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

Сподіваюся, це вам допоможе


0

Чому ви не використовуєте ACL для розрізнення трафіку? поверх моєї голови:

acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver

Це відповідає тому, що відповів Метью Браун.

Перегляньте документи ha , знайдіть такі речі, як hdr_dom і нижче, щоб знайти більше варіантів ACL. Є безліч варіантів вибору.



0

Можна зробити так -

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

Будь-який трафік, який потрапляє на http, перенаправлятиме на https


0

оператор перенаправлення є застарілою

використовуйте замість цього перенаправлення http-запиту

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

0

Просто:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.