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 重写配置的主要内容,如果未能解决你的问题,请参考以下文章