HAProxy在地图查找之前操纵字符串

时间:2015-10-29 19:42:24

标签: regex http-headers haproxy

我对HAProxy很陌生,但需要看似非常罕见的要求。我需要根据主机头查找地图中的项目,但我需要先应用一些字符串操作。

实施例: 请求来自i.domain.com 我需要脱掉我。并在我的地图中查找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请求标头?

1 个答案:

答案 0 :(得分:2)

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

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

将基于正则表达式的替换应用于输入字符串。它与着名的“sed”实用程序使用“s/<regex>/<subst>/”执行相同的操作。默认情况下,它会在输入字符串中替换与正则表达式<regex>匹配的最大部分的第一个匹配字符串<subst>。可以通过在第三个参数<flags>中添加标记“g”来替换所有出现的内容。通过在<flags>中添加标志“i”,也可以使正则表达式不敏感。由于<flags>是一个字符串,因此它由所有所需标志的串联组成。因此,如果需要“i”和“g”,则使用“gi”或“ig”将具有相同的效果。重要的是要注意,由于配置解析器的当前限制,诸如右括号或逗号之类的某些字符不可能在参数中使用。首次使用此转换器是将某些字符或字符序列替换为其他字符。

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