HAproxy配置问题:土耳其境外流量出现Too Many Redirects排查
解决HAproxy境外流量重定向导致的Too Many Redirects问题
这问题我之前帮朋友排查过,核心就是重定向规则没有排除目标域名的请求,导致无限循环了——咱们一步一步说清楚:
问题根源
当境外流量被重定向到lbde.test.com后,这个新请求依然会经过HAproxy的规则检查:
- 此时
CF-IPCountry还是非TR值 - 同时
test_deACL会匹配到lbde.test.com - 但你原来的规则里,重定向操作没有排除这个域名的请求,所以HAproxy会再次执行重定向,直接陷入循环。
修正后的配置
把你的规则调整成这样,就能解决循环问题:
acl acl_tr req.hdr(CF-IPCountry) eq "TR" acl test_hname hdr(host) -m end lbtest.test.com acl test_de hdr(host) -m end lbde.test.com # 土耳其境内访问lbtest.test.com,走业务后端 use_backend test_backends if acl_tr test_hname # 土耳其境内访问lbde.test.com,同样走后端(可根据你的业务需求调整) use_backend test_backends if acl_tr test_de # 仅当非土耳其境内、且访问的是lbtest.test.com时,才重定向到lbde.test.com redirect code 302 prefix https://lbde.test.com unless acl_tr test_de # 所有访问lbde.test.com的请求,直接走后端(不管境内境外) use_backend test_backends if test_de
关键修改点解释
- 重定向规则加排除条件:在
redirect指令的unless里新增test_de,意思是「如果请求来自土耳其,或者请求的是lbde.test.com,就不执行重定向」,彻底切断循环的可能。 - 补全境内访问lbde的规则:加上
use_backend test_backends if acl_tr test_de,确保土耳其用户即使直接访问lbde.test.com也能正常走后端(如果不需要这个逻辑,可以删掉,但建议保留以覆盖所有场景)。
验证逻辑
- 土耳其用户访问
lbtest.test.com:匹配acl_tr+test_hname,直接走后端,无重定向 - 境外用户访问
lbtest.test.com:不满足acl_tr和test_de,触发重定向到lbde.test.com - 境外用户访问
lbde.test.com:匹配test_de,直接走后端,不会再被重定向,循环终止
内容的提问来源于stack exchange,提问作者Meth
相关产品推荐
相关产品推荐

