2015-10-29 28 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將需要額外的時間進行審查,但如果這是唯一的方式,看起來它可能是時候更新。 –

相關問題