对于 haproxy 来说,nginx 的 error_page 497 选项有替代品吗?

对于 haproxy 来说,nginx 的 error_page 497 选项有替代品吗?

当使用 nginx 时,我可以使用 nginx 特有的 497 错误代码

497 HTTP 请求发送至 HTTPS 端口

并使用此规则重定向到 https:

error_page 497 https://$host:$server_port$request_uri;

当使用 haproxy 时,我知道的唯一解决方案是使用两个端口,例如端口 80 和 443,但我只有一个端口(8443)。

我尝试了该errorloc选项,但是当客户端尝试连接到 https 端口时,我收到了无法通过该errorloc选项捕获的 ssl 握手错误。

理想情况下我会使用以下命令但不起作用:

frontend http-in
    bind :8443 ssl crt /usr/local/etc/haproxy/ssl/fullchain.pem alpn h2,http/1.1
    redirect scheme https code 301 if !{ ssl_fc }
    maxconn 50

    default_backend backend-server

答案1

经过一番研究,事实证明,这确实可以通过 HAProxy 实现(一个端口用于 https 和 http 并将所有 http 请求重定向到 https)

我最终在 HAProxy 论坛上找到了解决方案卢卡斯特里布斯

以下示例来自卢卡斯特里布斯

frontend port801_combined
    mode tcp
    bind :801
    tcp-request inspect-delay 2s
    tcp-request content accept if HTTP
    tcp-request content accept if { req.ssl_hello_type 1 }
    use_backend recir_http if HTTP
    default_backend recir_https

backend recir_http
    mode tcp
    server loopback-for-http abns@haproxy-http send-proxy-v2
backend recir_https
    mode tcp
    server loopback-for-https abns@haproxy-https send-proxy-v2

frontend fe-https
    mode http
    bind abns@haproxy-https accept-proxy ssl crt /etc/ssl/private/unified-cert-file.pem
    # whatever you need todo for HTTPS traffic
frontend fe-http
    mode http
    bind abns@haproxy-http accept-proxy
    # whatever you need todo for HTTP traffic

通过增加

redirect scheme https code 301

到前端 fe-http 部分如下:

frontend fe-http
    mode http
    bind abns@haproxy-http accept-proxy
    redirect scheme https code 301

所有 http 请求都将重定向到 https。

相关内容