真正的快速问题关于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/web1或http://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