HAPROXY regsub 匹配 '?' 问号

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 匹配 '?'?我试过 '?'、'[?]'、'[\?]'。这些都不能匹配问号。

答案1

您不需要匹配?,因为它会将pathuri 的一部分与query stringhaproxy 中的部分分开,而 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 ) 的形式出现,然后调用适当的正则表达式来处理这两个将比简单地使用和上述方法https://example.com:6789/foobar?arg1=val1&arg2=val2要困难得多。有关相对和绝对 uri 的更多信息,请参阅set-pathset-queryhaproxy 文档

更新回应评论

您可以匹配路径部分并更改查询字符串,例如:

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

相关内容