HAproxy вызывает у меня проблемы с заменой регулярного выражения, это ошибка или я Я делаю что-то неправильно?

Я пытаюсь исправить проблему с параметром URL-адреса, принудительно кодируя URL-адрес на узле пути POST, что довольно часто встречается. Кажется, сейчас лучше всего напр. \ 1 \ / \ 2 , но тогда я бы получил что-то вроде (например) location /material.. добавление пробела, как упомянуто выше.

Я замечаю, что когда я пытаюсь добавить косые черты в группу захвата в регулярном выражении, это нарушает замену, заставляя меня дико гадать о таких вещах, как ... косые черты не сбежали, потому что они находятся в группе захвата? И почему я не могу просто вернуть их в замену как литералы? Это момент, когда я предполагаю, что, возможно, наткнулся на ошибку ... но также осознаю, что могу облажаться. Решение было разработано с использованием Nginx, но размещение экземпляра этого перед тем, что нам нужно, также не является самым практичным, если я могу заставить Haproxy сделать это, в основном потому, что мы уже используем Haproxy, чтобы делать совсем немного других вещей. уже.

Честно говоря, я предпочитаю решать эту проблему по-другому, но на данный момент использование прокси-сервера кажется мне одним из лучших вариантов. Я также не могу позволить себе роскошь заставлять создателя указывать лучшие пути.

1
задан 6 December 2016 в 06:44
1 ответ

Это предложение, которое я сделал в комментариях, кажется, делает почти правильную вещь:

reqrep ^([^\ :]+)(\ ?/.+/material/)(.+)/(.+)(\ .+)$ \1\2\3\4%2f\5

На самом деле я поместил \ 4 на неправильную сторону % 2f . Я также неправильно сделал пространство в начале второй группы захвата необязательным, что не нарушает регулярное выражение, но не является технически правильным.

Это правильная форма:

reqrep ^([^\ :]+)(\ /.+/material/)(.+)/(.+)(\ .+)$ \1\2\3%2f\4\5

Это проблема с reqrep - вы настраиваете непосредственно первую строку HTTP-запроса. Мощно, но утомительно.

Разбивка на части:

^ Всегда привязывайте свой шаблон к началу строки.

([^ \:] +) Это HTTP-глагол ( GET , POST и т. Д.). В нем не должно быть пробелов и двоеточия. Это группа захвата 1.

(\ /.+/material/) За глаголом должен следовать пробел, ведущая косая черта (косая черта в прямом направлении не требует escape-косой черты в регулярных выражениях HAProxy), один или несколько символов, то / material / ... это группа захвата 2.

(. +) Первая часть того, что мы хотим разделить в / , - это группа захвата 3 ... и действительно, это было бы правильнее было бы записать ([^ /] +) хотя большинство потенциальных несоответствий предотвращается за счет пространства, которое нам требуется в группе 5 ниже.

/ косая черта, которую мы хотим удалить

(. +) Часть URL-адреса после / - группа захвата 4

(\. +) пробел, за которым следует 1 или более символов, который будет захватывать HTTP / 1.x в конец строки запроса как группа захвата 5.

$ привязан к концу строки.

Затем соедините их все вместе.

\ 1 \ 2 \ 3% 2f \ 4 \ 5


HAProxy 1.6 справляется с этим более элегантно с помощью встроенного интерпретатора Lua, а также конвертера под названием regsub () (хотя это очень просто - только замены, без групп захвата, но он хорош для разделение строк) и определяемые пользователем переменные, в которые вы можете «спрятать» небольшие фрагменты данных при обработке запроса. Он также позволяет использовать http-request set-path и имеет path fetch для чтения и записи пути изолированно от остальной части URL и без настройки буфера HTTP-запроса. непосредственно с регулярным выражением. Большей части или всего этого нет в версии 1.5.

3
ответ дан 3 December 2019 в 18:32

Теги

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