Haproxy
HAPROXY regsub 匹配“?”問號
在 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
?
,因為它將path
uri 的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