hdr_sub 模式匹配的格式

hdr_sub 模式匹配的格式

我尝试匹配包含空格的标头的值,但无法确定 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

相关内容