如何将短主机名重定向至子域名(HAProxy配置)
解决HAProxy短主机名到FQDN的重定向问题
要实现短主机名(如server1)到完整FQDN(如server1.internal.mydomain.com)的重定向,同时保留HTTPS升级功能,你可以利用HAProxy的请求头变量和ACL组合完成字符串拼接,以下是具体方案:
核心配置修正
你的is_internal ACL逻辑是正确的,但重定向语句需要使用HAProxy内置的req.hdr(host)变量获取原始请求的主机头,再拼接成目标FQDN。同时要注意规则顺序,优先处理短域名转FQDN的逻辑,避免出现多次重定向。
替换重定向规则
将你写的:
http_request redirect location https://ORIGINALHOST.internal.mydomain.com if !is_internal
替换为:
# 对非内部FQDN的请求,重定向到带完整域名的HTTPS地址 http-request redirect location https://%[req.hdr(host),lower].internal.mydomain.com code 301 if !is_internal
%[req.hdr(host)]:获取原始请求的Host头内容(即短主机名,如server1),lower:可选,将主机名转为小写,保持格式一致性code 301:使用永久重定向,利于浏览器缓存优化
优化规则顺序
将短域名重定向规则放在HTTP转HTTPS规则之前,若希望一次性完成两个转换,也可以合并成一条规则:
# 同时处理HTTP转HTTPS和短域名转FQDN http-request redirect location https://%[req.hdr(host),lower].internal.mydomain.com code 301 if !is_internal or !{ ssl_fc }
分开写则更清晰,便于后续维护调整。
完整修正后的配置
defaults mode http timeout client 10s timeout connect 5s timeout server 10s timeout http-request 10s frontend mydomain_frontend # Listen for both http and https requests bind *:80 bind *:443 ssl crt /etc/ssl/certs/Wildcard_mydomain_web_server.pem # Setup conditional ACLs for hosts acl server1_hosts hdr_beg(host) -i server1. server1 server1-2. server1-2 acl server2_hosts hdr_beg(host) -i server2. server2 server2-2. server2-2 # Setup Conditional ACLs for redirecting short/host names to FQDNs acl is_internal hdr_sub(host) -i internal.mydomain.com # 优先处理短域名转FQDN的重定向 http-request redirect location https://%[req.hdr(host),lower].internal.mydomain.com code 301 if !is_internal # 处理HTTP到HTTPS的升级(仅针对已使用FQDN但用HTTP访问的情况) http-request redirect scheme https code 301 if !{ ssl_fc } and is_internal use_backend server1_bend if server1_hosts use_backend server2_bend if server2_hosts default_backend server1_bend # Setup DNS resolution resolvers default nameserver ns1 10.10.10.1:53 nameserver ns2 10.10.10.15:53 backend server1_bend mode http option forwardfor if-none server site server1.internal.mydomain.com:80 check resolvers default backend server2_bend mode http option forwardfor if-none server site server2.internal.mydomain.com:80 check resolvers default
关键注意事项
- 确保你的通配符证书
Wildcard_mydomain_web_server.pem覆盖*.internal.mydomain.com,否则HTTPS会出现证书验证错误 hdr_sub(host) -i internal.mydomain.com会匹配所有包含该后缀的主机头,比如server1.internal.mydomain.com或server2.internal.mydomain.com- 测试阶段可将301改为302临时重定向,便于调试修改
内容的提问来源于stack exchange,提问作者Mark Carpenter Jr
相关产品推荐
相关产品推荐

