2015-10-29 95 views
1

我对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

我打算说“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多得多。

+0

谢谢你。我们仍然在1.5倍以上,上升到1.6将需要额外的时间进行审查,但如果这是唯一的方式,看起来它可能是时候更新。 –

相关问题