HAProxy reqrep删除后端请求上的URI


27

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

我有以下示例域和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的。因此,即使我从文档中复制并粘贴了正则表达式,我也认为它存在问题。http://code.google.com/p/haproxy-docs/wiki/reqrep

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

谢谢!

-吉姆


现在有一个编辑和评论按钮。
克里斯·S

1
吉姆,您在评论时遇到了问题,因为您使用的帐户与创建该问题时所用的帐户不同。请尝试保持您的登录帐户一致,以免将来发生这种情况。我已标记一位主持人来解决此问题。
MDMarra 2012年

Answers:


28

你有这个:

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

我想你想要这个:

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

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

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

/ web1之前的所有内容都“捕获”了请求字符串中web1之前的所有内容。因此通常是GET或POST。(。*)“捕获” web1之后的所有内容,如果什么也没有,则什么也不捕获。

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


\ 1 \ \ 2 \ 3代表什么?关于reqrep文档,^([^^] *)\有什么作用?这是文档页面上给出的示例。#在任何请求路径的开头将“ / static /”替换为“ /”。reqrep ^([^ \] *)\ /static/(.*)\ 1 \ / \ 2
吉姆(Jim

阅读您的评论后,我意识到我提出的解决方案有点过于复杂。我简化了。
longneck 2012年

那么reqrep语法是什么?reqrep {string_2_search_thru} {search_string} {replace_string}?我对\ 1 \ \ 2 \ 3感到困惑吗?
吉姆(Jim)

如果用户输入/ web1或/ web1 /,是否有办法将此reqrep纳入工作?
吉姆(Jim)

你试过了吗?
longneck 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.