Haproxy

HAPROXY regsub 匹配“?”問號

  • November 30, 2020

在 HAproxy 中,用一些數據替換傳入的 url。這是傳入路徑:

/powerbi?redirectSuccessUrl=/reports

我想匹配:

/powerbi? 

將其替換為

clientId=${clientId}&

最終結果必須是:

/powerbi?clientId=${clientId}&redirectSuccessUrl=/reports

我試過這個

http-request set-path %[path, regsub(^/powerbi\?,/powerbi?clientId="${clientId}"&]

但是得到兩個問號(在 powerBi 附近和 redirectSuccessUrl 之前):

/powerbi?clientId=${clientId}&?redirectSuccessUrl=/reports

如何匹配“?” 與regsub?我試過了 ‘?’ , '

$$ ? $$’, ‘$$ ? $$’。這些都不符合問號。

您不匹配 for ?,因為它將pathuri 的query string一部分與 haproxy 的一部分分開,而 haproxy 已經為您做到了。您想更改查詢字元串,但更改了路徑。這就是為什麼您的更改最終出現在?. 而是使用http-request set-query,如下所示:

http-request set-query clientId=${clientId}&%[query]

如果您可能想根據原始 uri 是否有查詢來正確設置查詢,您可以試試這個:

http-request set-query clientId=${clientId}&%[query] if { query -m found }
http-request set-query clientId=${clientId} unless { query -m found }

這樣可以避免&在 uri 中沒有查詢字元串的情況下出現尾隨。

或者,您可以嘗試使用一些神奇的正則表達式set-uri並設置整個 uri,但要非常小心並記住 uri 可能以relative uri(eg /foobar?arg1=val1&arg2=val2) 或absolute uri(eg ) 形式出現,然後使用適當的正則表達式來處理這兩種情況將比簡單地使用和ashttps://example.com:6789/foobar?arg1=val1&arg2=val2困難得多多於。更多關於haproxy 文件中的相對和絕對 uriset-path``set-query

更新以回應評論

您可以匹配路徑部分並更改查詢字元串,例如:

acl url_powerbi path_beg /powerbi
acl query_string_found query -m found
http-request set-query clientId=${clientId}&%[query] if url_powerbi query_string_found
http-request set-query clientId=${clientId} if url_powerbi !query_string_found

引用自:https://serverfault.com/questions/1043840