HAProxy 将多个域名的 http 重定向到 https,无需 SSL 终止

HAProxy 将多个域名的 http 重定向到 https,无需 SSL 终止

我正在使用 HAProxy 将流量重定向到本地网络中的不同 Web 服务器。

如果未启用 SSL,我可以像这样根据主机名进行路由(在前端部分):

acl is_local hdr_end(host) -i mirror.skbx.co
acl is_kiev  hdr_end(host) -i kiev.skbx.co

use_backend kiev if is_kiev
default_backend wwwlocalbackend

一旦我启用 SSL,一切都将通过 SSL 模式在 TCP 模式下运行。

但我还需要确保 HTTP 重定向到 HTTPS。当我使用:

redirect scheme https if !{ ssl_fc }

在我的 HAProxy 配置的 HTTP 前端部分,我将所有请求重定向到默认后端,因此如果请求从 重定向,则会忽略上述 acl 规则redirect scheme

这个问题有答案关于如何通过 SSL 终止使其工作,其中 SSL 在 HAProxy 级别被剥离。

我的问题是 - 在保留直通(模式 tcp)的同时是否可以将 HTTP 重定向到 HTTPS?

我拥有的前端和后端部分的完整配置位于这个要点

答案1

在 TCP 模式下,HAproxy 实际上甚至不会终止 SSL,它只是将数据包传递到后端。由于https-frontend无法解码以下几行中的标头,它只是将所有内容传递给default_backend

您必须在线上指定一个证书bind并在其中运行前端和后端mode http

例如:

frontend http-frontend
    bind 10.1.0.4:80

    redirect scheme https if !{ ssl_fc }

frontend https-frontend
    bind 10.1.0.4:443 ssl crt /etc/ssl/haproxy.pem

    option httplog
    mode http

    acl is_local hdr_end(host) -i mirror.skbx.co
    acl is_kiev  hdr_end(host) -i kiev.skbx.co

    use_backend kiev if is_kiev
    default_backend wwwlocalbackend

backend wwwlocalbackend
    mode http
    server 1-www 127.0.0.1:443

backend kiev
    mode http
    server 1-www 10.8.0.6:443

其中/etc/ssl/haproxy.pem包含您想要托管的所有域的证书,或涵盖这些域的通配符证书。

如果每个域都有单独的证书,则需要按照frontend ft_test您发布的问题中接受的答案进行配置(在 Haproxy 中配置多个 SSL 证书)。

相关内容