HAProxy reqrep删除后端请求的URI

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

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

http://domain/web1 http://domain/web2 

我想要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 

如果我转到http://domain/web1http://domain/web2我会在错误日志中看到在每个后端的服务器上请求分别为资源/ web1或/ web2的请求。 所以我相信我的正则expression式有问题,尽pipe我从文档中复制并粘贴了它。 http://code.google.com/p/haproxy-docs/wiki/reqrep

简介:我试图根据URI路由stream量,但是我希望HAProxy在将请求发送到后端池时去除URI。

谢谢!

-Jim

你有这个:

 reqrep ^([^\ ]*)\ /web1/(.*) \1\ /\2 

我想你想要这个:

 reqrep ^([^\ ]*\ /)web1[/]?(.*) \1\2 

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

回答下面的评论,详细说明上述expression式如何工作比我能给出的更多的努力。 不过,也许这会有所帮助。

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

下一部分( \1\2 )说明如何处理这些捕获的部分。 它表示形成一个由\1 (第一个捕捉部分)和\2 (后面是第二个捕捉部分)组成的string。 由于web1从来没有被捕获,它没有被组装到最终的输出。

把这个放在前端

 reqirep ^([^\ :]*)\ /(.*) \1\ /web1/\2 

好的教训学会去掉string: https : //gist.github.com/PiBa-NL/8ad6c222354cbd7a5af5