You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:20:49