Nginx

nginx 的 haproxy 的 error_page 497 選項是否有替代方案?

  • July 13, 2020

使用 nginx 時,我只能使用特定於 nginx 的 497 錯誤程式碼

497 HTTP 請求發送到 HTTPS 埠

並使用此規則重定向到 https:

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

使用 haproxy 時,我知道的唯一解決方案是使用兩個埠,例如埠 80 和 443,但我只有一個埠 (8443)。

我嘗試了該errorloc選項,但是當客戶端嘗試連接到 https 埠時,我收到一個無法使用該errorloc選項擷取的 ssl handshare 錯誤。

理想情況下,我會使用以下內容,但這不起作用:

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

經過一些研究,事實證明這確實可以通過 HAProxy 實現(一個埠用於 https 和 http,並將所有 http 請求重定向到 https)

我終於在lukastribus的 HAProxy 論壇中找到了解決方案。

以下範例來自lukastribus

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。

引用自:https://serverfault.com/questions/1023748