Ответ 1
Я нашел, что это самая большая помощь:
Используйте HAProxy 1.5 или новее и просто добавьте следующую строку в конфигурацию внешнего интерфейса:
redirect scheme https code 301 if !{ ssl_fc }
Я использую HAProxy для балансировки нагрузки и хочу, чтобы мой сайт поддерживал https. Таким образом, я хотел бы перенаправить все запросы на порт 80 на порт 443.
Как мне это сделать?
Изменить: мы хотели бы перенаправить на тот же URL-адрес на https, сохраняя параметры запроса. Таким образом, http://foo.com/bar будет перенаправляться на https://foo.com/bar
Я нашел, что это самая большая помощь:
Используйте HAProxy 1.5 или новее и просто добавьте следующую строку в конфигурацию внешнего интерфейса:
redirect scheme https code 301 if !{ ssl_fc }
У меня недостаточно репутации, чтобы прокомментировать предыдущий ответ, поэтому я отправляю новый ответ, чтобы дополнить ответ Джей Тейлора. В основном его ответ будет делать перенаправление, подразумеваемая переадресация, хотя и означает, что он выдает 302 (временное перенаправление), но поскольку вопрос информирует о том, что весь веб-сайт будет обслуживаться как https, то соответствующее перенаправление должно быть 301 (постоянная переадресация).
redirect scheme https code 301 if !{ ssl_fc }
Кажется, небольшое изменение, но влияние может быть огромным в зависимости от веб-сайта, с постоянным перенаправлением мы сообщаем браузеру, что он больше не будет искать версию http с самого начала (избегая будущих переадресаций) - время заставка для сайтов https. Это также помогает с SEO, но не разделяет сок ваших ссылок.
Чтобы перенаправить весь трафик:
redirect scheme https if !{ ssl_fc }
Чтобы перенаправить один URL-адрес (в случае множественного интерфейса/бэкэнд)
redirect scheme https if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }
Лучший гарантированный способ перенаправления всего http на https:
frontend http-in
bind *:80
mode http
redirect scheme https code 301
Это немного интереснее, используя "код 301", но может также позволить клиенту знать его постоянное. "Http-часть режима не является существенной с конфигурацией по умолчанию, но не может повредить. Если у вас есть mode tcp
в разделе по умолчанию (как и я), тогда это необходимо.
Согласно 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
Небольшое изменение пользовательского решения2966600...
Чтобы перенаправить все кроме один URL (в случае множественного интерфейса/бэкэнд):
redirect scheme https if !{ hdr(Host) -i www.mydomain.com } !{ ssl_fc }
Как сказал Джей Тейлор, HAProxy 1.5-dev имеет директиву конфигурации redirect scheme
, которая выполняет именно то, что вам нужно.
Однако, если вы не можете использовать 1.5, и если вы хотите скомпилировать HAProxy из исходного кода, я поддерживал функциональность redirect scheme
, поэтому он работает в версии 1.4. Здесь вы можете получить патч: http://marc.info/?l=haproxy&m=138456233430692&w=2
frontend unsecured *:80
mode http
redirect location https://foo.bar.com
Если вы хотите переписать 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
Я надеюсь, что это поможет вам
Почему вы не используете ACL для различения трафика? на моей голове:
acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver
Это относится к тому, что ответил Мэтью Браун.
Смотрите га документы, ищите такие вещи, как hdr_dom и ниже, чтобы найти дополнительные опции ACL. Есть много вариантов.
Добавьте это в конфигурацию внешнего интерфейса HAProxy:
acl http ssl_fc,not
http-request redirect scheme https if http
В более новых версиях HAProxy рекомендуется использовать
http-request redirect scheme https if !{ ssl_fc }
чтобы перенаправить http-трафик на https.