【问题标题】:HAProxy manipulate string prior to map lookupHAProxy 在地图查找之前操作字符串
【发布时间】:2016-01-30 03:02:58
【问题描述】:

我对 HAProxy 很陌生,但需要一个看起来相当罕见的要求。我需要根据主机标头在地图中查找一个项目,但我需要先应用一些字符串操作。

示例: 请求进入 i.domain.com 我需要去掉 i。并在我的地图中查找 domain.com。

我可以通过使用初始请求中的值创建一个新的临时标头来做到这一点,然后用一些正则表达式替换该值,如下所示:

http-request set-header X-Temp %[req.hdr(host)]
http-request replace-value X-Temp [a-zA-Z].(.*)(:)?.* \1
http-request set-header X-ID %[req.hdr(X-Temp),lower,map(/some.map,99999)]

当我真正需要的只是这样的单行时,这似乎很浪费:

http-request set-header X-ID %[(apply [a-zA-Z].(.*)(:)?.* \1 to req.hdr(host)),lower,map(/some.map,99999)]

我试图让 reqrep 做到这一点,但没有任何运气。如何在不实际将其保存回 http 请求标头的情况下操纵字符串以进行查找?

【问题讨论】:

    标签: regex http-headers haproxy


    【解决方案1】:

    我本来想说“Lua”:) 但 HAProxy 1.6 有一个新的 regsub 转换器,它应该完全符合您的要求。

    regsub(<regex>,<subst>[,<flags>])
    

    对输入字符串应用基于正则表达式的替换。它与带有“s/&lt;regex&gt;/&lt;subst&gt;/”的著名“sed”实用程序执行相同的操作。默认情况下,它将在输入字符串中将匹配正则表达式&lt;regex&gt;的最大部分的第一次出现替换为替换字符串&lt;subst&gt;。可以通过在第三个参数&lt;flags&gt; 中添加标志“g”来替换所有匹配项。也可以通过在&lt;flags&gt; 中添加标志“i”来使正则表达式不区分大小写。由于&lt;flags&gt; 是一个字符串,它由所有所需标志的串联组成。因此,如果“i”和“g”都需要,使用“gi”或“ig”将具有相同的效果。需要注意的是,由于当前配置解析器的限制,某些字符(例如右括号或逗号)无法在参数中使用。这个转换器的第一个用途是用其他字符替换某些字符或字符序列。

    reqrep 不起作用,因为它在流程中的处理时间比http-request 晚得多。

    【讨论】:

    • 谢谢。我们仍处于 1.5 倍,而要达到 1.6 则需要额外的时间进行审查,但如果这是唯一的方法,那么看起来可能是时候更新了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2016-09-14
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多