我尝试匹配包含空格的标头的值,但无法确定 haproxy 喜欢什么正则表达式。我想要的标头如下所示:
X-Request-ID:'Foo: Bar'
我可以精确匹配此标题或以该标题开头的任何内容。但是,我不想匹配“Foo: Other”我迄今为止的尝试:
acl badhdr hdr_sub(X-Request-ID) -i Foo: Bar
匹配以 Foo 开头的任何内容
acl badhdr hdr_sub(X-Request-ID) -i Foo:\sBar
根本与“Foo: Bar”不匹配......
非常感谢帮助
答案1
我几乎倾向于认为 HAProxy 接受这一点......
acl badhdr hdr_sub(X-Request-ID) -i Foo: Bar
...可能是个错误,并且“ Bar”被默默地丢弃了。我必须进一步研究才能确定,但表达这一点的正确方法是用反斜杠转义空格...
acl badhdr hdr_sub(X-Request-ID) -i Foo:\ Bar
...或者将表达式括在引号中...
acl badhdr hdr_sub(X-Request-ID) -i "Foo: Bar"
请注意,这_sub
不是正则表达式——它只是子字符串匹配。您可能需要hdr_beg
——开头的子字符串。
对于锚定的正则表达式,包括开头'
(假设这是标题的一部分,因为它似乎来自问题,所以它也需要转义),我相信表达式会是这样的:
acl badhdr hdr_reg(X-Request-ID) -i ^\'Foo:\ Bar
答案2
根据文档,hdr_sub 接受子字符串匹配作为参数。
根据有关 HTTP 标头操作的文档(相同链接),子字符串正则表达式有点不常规:
\t for a tab
\r for a carriage return (CR)
\n for a new line (LF)
\ to mark a space and differentiate it from a delimiter
\# to mark a sharp and differentiate it from a comment
\\ to use a backslash in a regex
\\\\ to use a backslash in the text (*2 for regex, *2 for haproxy)
\xXX to write the ASCII hex code XX as in the C language
因此,这应该对你有用:
acl badhdr hdr_sub(X-Request-ID) -i Foo:\ Bar