2012-11-05 2 views
64

Я использую HAProxy для балансировки нагрузки и хочу, чтобы мой сайт поддерживал https. Таким образом, я хотел бы перенаправить все запросы на порт 80 на порт 443.HAProxy перенаправление http на https (ssl)

Как бы это сделать?

Редактировать: Мы хотели бы перенаправить на тот же URL-адрес на https, сохраняя параметры запроса. Таким образом, http://foo.com/bar бы перенаправить https://foo.com/bar

ответ

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 веб-серверов за прокси-сервером, вы можете попробовать этот пример конф на вашем 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 

Я надеюсь, что это поможет вам

12

Согласно 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 
+5

Так, чтобы перенаправить все на https://foo.bar.com. В идеале мы хотели бы, чтобы http://foo.bar.com/baz перенаправлялся на https://foo.bar.com/baz. Нам также нужны параметры запроса. –

+0

@JonChu повышает допустимый прецедент, это лишь частичное решение. –

+2

Вместо того, чтобы использовать перенаправление, попробуйте переадресовать префикс https: //foo.bar.com. Это должно помочь в случае использования Джон Чу. – xangxiong

0

Почему вы не используете ACL для отличия трафика? на верхней части головы:

acl go_sslwebserver path bar 
use_backend sslwebserver if go_sslwebserver 

Это относится к тому, что ответил Мэтью Браун.

См. ha docs, ищите такие вещи, как hdr_dom и ниже, чтобы найти дополнительные опции ACL. Есть много вариантов.

95

I found this to be the biggest help:

Использование HAProxy 1,5-dev13 или более поздняя версия, и просто добавьте следующую строку в фронтэнде конфигурацию:

redirect scheme https code 301 if !{ ssl_fc } 
+4

Это осветляет мой день! – bertie

+11

Чтобы добавить к этому, из ответа User2966600 ниже, с добавленным 301, используйте это для перенаправления на https только для определенного домена: 'redirect scheme https code 301 if {hdr (Host) -i www.mydomain.com}! {Ssl_fc } ' –

+1

Это сработало. Хотя он не работает без «кода 301». Благодарим за обновление. – Dharmavir

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

Это 'режим http' сделал трюк, спасибо! –

28

Чтобы перенаправить весь трафик:

redirect scheme https if !{ ssl_fc }

Для перенаправления одного URL-адреса (в случае множественный интерфейс/бэкенд)

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

+1

Спасибо, условие «только на конкретном хосте» было именно тем, что я искал! –

4

Как Джей Тейлор сказал, HAProxy 1,5-Дева директива redirect scheme конфигурации, которая завершала именно то, что вам нужно.

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

50

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

redirect scheme https code 301 if !{ ssl_fc } 

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

+2

+1, добавил ваше решение к ответу Джей Тейлор – greg0ire

8

Небольшое изменение раствора user2966600 в ...

Чтобы перенаправить все кроме один URL (в случае множественного внешнего интерфейса/бэкэнд):

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

Лучший гарантированный способ перенаправить все HTTP в HTTPS является:

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

Это немного фантазер с помощью «код 301", но может также позволить клиенту знать его Постоянный. Часть «mode http» не является обязательной для конфигурации по умолчанию, но не может повредить. Если у вас есть mode tcp в разделе по умолчанию (как и я), тогда это необходимо.

Смежные вопросы