HAProxy 1.7:通过映射文件实现特定域名重定向与URI重写问询
嘿,作为HAProxy新手,用映射文件来管理重定向和URI重写绝对是个聪明的选择——这种方式把规则集中在单独文件里,修改起来不用动主配置,特别灵活!我来一步步给你拆解实现方法:
一、用映射文件实现域名重定向
1. 编写redirect.map规则文件
先创建一个映射文件,格式很简单:每行是源域名 + 空格 + 目标重定向地址,注释用#开头。按照你的需求,文件内容可以这样写:
# redirect.map - 域名重定向规则 abc.com https://new-abc.example.com def.ru https://def-new.example.ru # asd.com 不需要重定向,所以这里不用写规则
2. 在HAProxy主配置里加载映射并配置重定向逻辑
打开你的HAProxy配置文件(通常是/etc/haproxy/haproxy.cfg),在frontend段里添加加载映射和触发重定向的规则:
frontend main bind *:80 # 先加载映射文件 # 匹配请求的Host头,如果在映射文件里能找到对应值,就跳转到redirect_backend use_backend redirect_backend if { hdr(host),map(/etc/haproxy/redirect.map) -m found } # 专门处理重定向的backend backend redirect_backend # 从映射文件里取出对应的目标地址,返回301永久重定向 redirect location %[hdr(host),map(/etc/haproxy/redirect.map)] code 301
原理很简单:当用户请求abc.com或def.ru时,HAProxy会匹配到映射文件里的规则,进入redirect_backend返回重定向响应;而asd.com不在映射文件里,不会触发这个backend,自然就不会执行重定向。
二、HAProxy支持用映射文件实现URI重写吗?当然可以!
用映射文件管理URI重写和域名重定向逻辑类似,同样是先写映射规则,再在主配置里调用。
1. 编写uri_rewrite.map规则文件
文件格式是源URI + 空格 + 目标URI,比如:
# uri_rewrite.map - URI重写规则 /old-product-page /new-catalog/item123 /blog/2023/post /articles/tech/archive/2023
如果需要前缀匹配(比如所有以/old-api/开头的URI都重写到/new-api/),可以把规则写成:
/old-api/ /new-api/
2. 在HAProxy配置里配置URI重写
在frontend或者backend段里添加http-request set-path指令,实现URI替换:
frontend main bind *:80 # 加载URI重写映射:如果请求的path在映射里有匹配,就替换成目标值;没匹配到就用原path http-request set-path %[path,map(/etc/haproxy/uri_rewrite.map,%[path])]
如果是前缀匹配的场景,把map改成map_beg(匹配path开头):
http-request set-path %[path,map_beg(/etc/haproxy/uri_prefix_rewrite.map,%[path])]
比如上面的前缀规则,/old-api/user/1就会被重写成/new-api/user/1。
一些实用小提示
- 修改映射文件后,不需要重启HAProxy,执行
haproxy -f /etc/haproxy/haproxy.cfg -sf $(pidof haproxy)就能平滑重载配置,不影响业务。 - 每次修改配置后,先用
haproxy -c -f /etc/haproxy/haproxy.cfg检查语法,避免配置错误导致服务中断。 - 重定向的状态码:301是永久重定向(适合长期迁移),302是临时重定向(适合短期调整),根据你的业务需求选择。
内容的提问来源于stack exchange,提问作者Rivest
相关产品推荐
相关产品推荐

