HAProxy 和 URL 重写配置

Posted

技术标签:

【中文标题】HAProxy 和 URL 重写配置【英文标题】:HAProxy and URL Rewriting Configuration 【发布时间】:2012-01-02 09:45:35 【问题描述】:

我想问一下 HAProxy 如何帮助根据 URL 的各个部分路由请求。

为了让您大致了解我的设置,我有 HAProxy 机器和两个后端:

IIS 网站(主站点) nginx 上的 Wordpress 博客(子网站)

用例:

我希望根据 URL 路由请求:

www.website.com/lang/index.aspx -> 主站点 www.website.com/lang/blog/articlexx -> 博客子网站

博客访问 URL 是“/server/blog/lang/articlexx”,所以我必须将原始客户端请求重写为该格式——这基本上是切换“博客”和“语言” .

根据我对配置文档和网上一些帖子的理解,我可以使用 reqrep/reqirep 在将请求 HTTP 标头传递到后端之前对其进行更改。如果这是正确的,那么这个配置应该可以工作:

frontend vFrontLiner
    bind            x.x.x.x:x
    mode            http
    option          httpclose
    default_backend iis_website

    # the switch: x/lang/blog -? x/blog/lang
    reqirep ^/(.*)/(blog)/(.*) /if\2/\1/\3

    acl blog path_beg -i /lang/blog/

    use_backend blog_website if blog


backend blog_website
    mode    http
    option  httpclose
    cookie  xxblogxx insert indirect nocache
    server  BLOG1 x.x.x.x:80 cookie s1 check inter 5s rise 2 fall 3
    server  BLOG2 x.x.x.x:80 cookie s2 check inter 5s rise 2 fall 3 backup

问题: blog_website 后端收到的请求仍然是原来的URL“x/lang/blog”。

我可能错过了正则表达式部分的某些内容,但我主要关心的是我的理解是否正确,首先要使用 reqirep。我将不胜感激。

非常感谢。

【问题讨论】:

看完这篇文章后,我开始意识到上面的解决方案是不可能的。 serverfault.com/questions/189916/… 您不想根据 HaProxy 选择的后端服务器更改 URL。您的切换完全是使用use_backend 完成的,所以问题只是路径重写,而不是后端切换。重写也可以在后端完成。 【参考方案1】:

您的正则表达式错误,您假设服务器位于请求路径中。要匹配标头中的请求路径,请使用如下正则表达式:

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

您也可以使用 reqirep,但这仅在您的服务器实际上也为 /BLog/lAnG/ 提供服务时才有用。

【讨论】:

正则表达式应位于前端并在上述情况下附加if blog,或位于blog_website 后端。它还应该拼写reqrep ^([^\ :]*)\ /lang/blog/(.*) \1\ /blog/lang/\2 以不匹配标题(区别是:)。如果 Cookie 有 path=,则不会重写它们,但无论如何这很困难。 嗨@Tino,我面临URL重写后cookie路径的问题,你能分享一些关于如何处理的示例吗? @ThiamTeck 我会尝试类似http-response replace-value Set-Cookie ;\ path=/blog/lang ;\ path=/lang/blog 的方法,请参阅:haproxy.com/documentation/aloha/9-0/traffic-management/…(注意:我认为此页面在替换示例中缺少一些“\”。)但以上内容需要适应您的需要,例如path 可能只是/blog - 正如我所说,这很困难。警告:我没有测试过它,也不需要它,这里的所有内容都是由文档完成的,而不是通过 HaProxy 测试。【参考方案2】:

如果这仍然不起作用,请切换到稳定版本,例如截至目前 reqrep 在 1.5 dev 中被破坏。切换到 1.4 进行修复。

【讨论】:

以上是关于HAProxy 和 URL 重写配置的主要内容,如果未能解决你的问题,请参考以下文章

HAProxy URL重写

在ajax当中使用url重写来避免url的暴露

HAProxy原理和基本概念(基础)

在 AngularJS 中重写 jQuery Ajax 调用

如何使用haproxy进行url路径重定向,非域名跳转

Nginxnginx 代理 Haproxy 怎么设置?