Подтвердить что ты не робот

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

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

Как мне это сделать?

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

4b9b3361

Ответ 2

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

redirect scheme https code 301 if !{ ssl_fc }

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

Ответ 3

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

redirect scheme https if !{ ssl_fc }

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

Небольшое изменение пользовательского решения2966600...

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

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

Если вы хотите переписать URL-адрес, вам нужно изменить свой виртуальный хост сайта, добавив следующие строки:

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

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

Ответ 10

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

acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver

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

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

Ответ 11

Добавьте это в конфигурацию внешнего интерфейса HAProxy:

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

HAProxy - Redirecting HTTP Requests

Ответ 12

В более новых версиях HAProxy рекомендуется использовать

http-request redirect scheme https if !{ ssl_fc }

чтобы перенаправить http-трафик на https.