Формат для сопоставления с образцом 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' вообще...
Помощь очень ценится
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
Согласно документации, 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