使用正则表达式识别 URL 参数(不知道具体是哪个参数)

使用正则表达式识别 URL 参数(不知道具体是哪个参数)

因此,我一直在构建一个 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&param1=foo&getsomething&param2=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是错误的解决方案,因为正则表达式匹配的是价值参数,而不是其名称...并且您没有值。

相关内容