HAProxy多子域名SSL透传转发跳转异常 疑似Cookie相关问题
问题根因
- 你遇到的跳转异常和Cookie、粘性会话无关:当前配置未开启任何粘性会话规则,且SSL passthrough模式下HAProxy不会解析应用层的Cookie内容。
- 核心问题是TLS连接复用:当sub3、sub4.mydomain.com的证书为通配符证书(或SAN扩展包含对方域名)时,浏览器会识别到两个域名指向同一个公网IP+端口,会复用已建立的TLS连接,不会重新发起携带SNI的SSL握手。HAProxy仅在首次SSL握手时识别SNI转发,后续复用的连接会全部走首次握手匹配的backend,就出现了先访问哪个子域名,后续同IP的其他子域名就跳转到对应后端的问题。
修复方案
方案1(推荐,适配SSL passthrough要求)
确保sub3、sub4.mydomain.com使用独立的单域名证书,证书的SAN扩展不包含对方域名。此时浏览器复用TLS连接时会校验证书域名不匹配,自动重新发起SSL握手并携带正确的SNI,HAProxy可正常匹配转发规则。
方案2(兼容小流量场景,需HAProxy 2.0+)
在websites_443前端配置中添加规则,拒绝复用的TLS会话,强制每次新域名访问都重新握手:
frontend websites_443 bind *:443 mode tcp option tcplog tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } # 新增如下规则,拒绝复用的SSL会话 tcp-request content reject if { ssl_fc_session_reused } # 原有ACL和use_backend规则保持不变
注意:该方案会略微增加TLS握手的性能开销,适合访问量不大的场景。
方案3(如果允许调整需求,放弃SSL passthrough)
在HAProxy侧配置SSL终止,将443前端改为HTTP模式,基于Host头转发请求,天然不受TLS连接复用影响,同时可以配置HTTP/2、统一证书管理等额外能力。
配置优化建议
你当前的配置存在一处疏漏:sub4_443 backend的server行缺失check参数,若需要HAProxy自动检测后端节点可用性,建议补充为:
backend sub4_443 mode tcp balance roundrobin option ssl-hello-chk server sub4 d.d.d.d:443 check
内容的提问来源于stack exchange,提问作者Przemysław Witek
相关产品推荐
相关产品推荐

