HAProxy reqrep 在后端请求中删除 URI

Jim*_*Jim 30 rewrite load-balancing haproxy uri

关于 HAProxy reqrep 的真正快速问题。我正在尝试重写/替换发送到后端的请求。

我有以下示例域和 URI,它们共享相同的域名,但后端 Web 服务器池不同。

http://domain/web1
http://domain/web2
Run Code Online (Sandbox Code Playgroud)

我希望 web1 转到后端 webfarm1,而 web2 转到 webfarm2。目前这确实发生了。但是,当请求发送到后端时,我想去掉 web1 或 web2 URI。

这是我的 haproxy.cfg

frontend webVIP_80
        mode http
        bind    :80
        #acl routing to backend
        acl web1_path path_beg /web1
        acl web2_path path_beg /web2

        #which backend
        use_backend webfarm1 if web1_path
        use_backend webfarm2 if web2_path
        default_backend webfarm1

backend webfarm1
        mode http
        reqrep ^([^\ ]*)\ /web1/(.*)     \1\ /\2
        balance roundrobin
        option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
        server webtest1 10.0.0.10:80 weight 5 check slowstart 5000ms
        server webtest2 10.0.0.20:80 weight 5 check slowstart 5000ms
backend webfarm2
        mode http
        reqrep ^([^\ ]*)\ /web2/(.*)     \1\ /\2
        balance roundrobin
        option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
        server webtest1-farm2 10.0.0.110:80 weight 5 check slowstart 5000ms
        server webtest2-farm2 10.0.0.120:80 weight 5 check slowstart 5000ms
Run Code Online (Sandbox Code Playgroud)

如果我去http://domain/web1http://domain/web2在错误日志中看到每个后端服务器上的请求分别是针对资源 /web1 或 /web2 的请求。因此,我认为我的正则表达式有问题,即使我从文档中复制并粘贴了它。http://code.google.com/p/haproxy-docs/wiki/reqrep

摘要:我正在尝试根据 URI 路由流量,但是我希望 HAProxy 在将请求发送到后端池时剥离 URI。

谢谢!

-吉姆

lon*_*eck 30

你有这个:

reqrep ^([^\ ]*)\ /web1/(.*)     \1\ /\2
Run Code Online (Sandbox Code Playgroud)

我想你想要这个:

reqrep ^([^\ ]*\ /)web1[/]?(.*)     \1\2
Run Code Online (Sandbox Code Playgroud)

不同之处在于,如果省略 webN 之后的 / ,则第二个将起作用。

为了回答您在下面的评论,详细了解上述表达式的工作方式比我所能付出的更多。但是,也许这会有所帮助。

/web1 之前的所有内容都在“捕获”请求字符串中 web1 之前的所有内容。所以通常这将是 GET 或 POST。(.*) “捕获” web1 之后的所有内容,如果什么都没有,则不包括任何内容。

下一部分 ( \1\2) 说明如何处理这些捕获的部分。它说形成一个由\1(第一个捕获的部分)和\2(后面是第二个捕获的部分)组成的字符串。由于从未捕获 web1,因此不会将其组装到最终输出中。


dig*_*666 5

从 HAProxy 2.1 版开始,就没有 reqrep 指令。所以你可以使用以下内容:

http-request replace-path /web1(.*) \1
Run Code Online (Sandbox Code Playgroud)