如何在HAProxy中获取路径内容并复用端口值(不使用if命令)
HAProxy无if命令提取路径端口配置方案
你可以通过HAProxy的正则捕获和变量赋值实现需求,无需使用if命令,同时简化大量重复的backend配置。以下是优化后的完整配置:
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners stats timeout 30s user haproxy group haproxy daemon defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 frontend http80 bind *:2095 mode http # 用正则捕获路径开头的端口号,匹配/端口/...格式的请求 acl port_in_path path_reg ^/(\d+)/ # 提取捕获到的端口号存入请求变量 setvar req.backend_port %[capture.req.path.1] # 重写请求路径,去掉开头的/端口/部分,避免后端收到带端口的路径 reqirep ^([A-Z]+) /(\d+)/(.*) \1 /\3 # 匹配到端口路径时,使用动态后端 use_backend dynamic_webs if port_in_path backend dynamic_webs mode http # 使用变量指定后端服务器的端口 server webserver1 ip:%[var(req.backend_port)]
关键配置说明
- 正则捕获ACL:
acl port_in_path path_reg ^/(\d+)/匹配路径以/数字/开头的请求,括号内的\d+作为捕获组,专门提取端口号。 - 变量赋值:
setvar req.backend_port %[capture.req.path.1]将捕获组1的内容(即端口号)存入请求变量req.backend_port,供后续调用。 - 路径重写:
reqirep指令将GET /1023/test这类请求重写为GET /test,确保后端服务器收到的是正常业务路径。 - 动态后端:backend中直接用
%[var(req.backend_port)]变量指定服务器端口,无需为每个端口单独创建backend配置。
如果需要支持/端口(无后续路径)的请求格式,可以调整正则和路径重写规则:
# 匹配/端口或/端口/格式的请求 acl port_in_path path_reg ^/(\d+)(/?.*) # 重写路径为根路径或后续路径 reqirep ^([A-Z]+) /(\d+)(/?.*) \1 \3
内容的提问来源于stack exchange,提问作者Mahdi Mahdidadashnezhad
相关产品推荐
相关产品推荐

