Формат сопоставления с образцом 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' ...

Помощь очень ценится

3
задан 23 September 2016 в 15:08
2 ответа

Я почти склонен думать, что тот факт, что HAProxy принимает это...

acl badhdr hdr_sub(X-Request-ID) -i Foo: 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
ответ дан 3 December 2019 в 06:28

Согласно документации , 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
1
ответ дан 3 December 2019 в 06:28

Теги

Похожие вопросы