因此,我一直在构建一个 haproxy 集群(1.5.x),并且遇到了一个障碍,对于特定的 web 应用程序,我想将 API GET 投放到只读应用程序集群,并将 PUT 投放到更小的写入集群。
我试过用路径注册,它似乎不想匹配文件名以外的任何内容。 urlp 派生函数似乎是我应该使用的,但它们的正确用法却让我困惑。 我试图捕捉和区分的 URL 参数的一个棘手细微差别是它们都以“get”或“set”开头……但参数没有值。 从我的理解或尝试来看,urlp 派生函数通常期望有一个与参数相关联的值,因此似乎我不能简单地使用类似的东西:
acl api_gets urlp_reg(get) (get?){1}
来自带有如下参数的 URL:
/api.foo?apikey=stuff¶m1=foo&getsomething¶m2=bar
相似地,路径注册似乎没有拾取文件名以外的任何内容,因此尝试匹配以下内容作为概念证明的基本测试也是无果而终:
acl path_sanity_check path_reg ^\/api\.foo\?apikey.*
而简单地制作正则表达式模式^/api.foo将从请求被发送到的地方开始。
应该即使参数没有值,我也会使用 urlp_reg 来实现这一点吗?如果不使用 urlp 派生函数,还有什么替代方案?
答案1
路径获取小路。查询不是路径的一部分。 capture.req.uri
获取完整的 URI。
虽然有些草率,但你可以将其与以下内容进行匹配:
acl foo capture.req.uri -m reg [&\?]get
字符类转义可能需要调整,但想法是在请求 URI 中找到?get
或。&get
如果您正在构建新的集群,请使用 HAProxy 1.6,它具有许多新的、有用的获取和转换器,以及可选的 Lua 集成,以实现更复杂的逻辑。
urlp_reg
是错误的解决方案,因为正则表达式匹配的是价值参数,而不是其名称...并且您没有值。