Я пытаюсь исправить проблему с параметром URL-адреса, принудительно кодируя URL-адрес на узле пути POST, что довольно часто встречается. Кажется, сейчас лучше всего
напр. \ 1 \ / \ 2
, но тогда я бы получил что-то вроде (например) location /material..
добавление пробела, как упомянуто выше.
Я замечаю, что когда я пытаюсь добавить косые черты в группу захвата в регулярном выражении, это нарушает замену, заставляя меня дико гадать о таких вещах, как ... косые черты не сбежали, потому что они находятся в группе захвата? И почему я не могу просто вернуть их в замену как литералы? Это момент, когда я предполагаю, что, возможно, наткнулся на ошибку ... но также осознаю, что могу облажаться. Решение было разработано с использованием Nginx, но размещение экземпляра этого перед тем, что нам нужно, также не является самым практичным, если я могу заставить Haproxy сделать это, в основном потому, что мы уже используем Haproxy, чтобы делать совсем немного других вещей. уже.
Честно говоря, я предпочитаю решать эту проблему по-другому, но на данный момент использование прокси-сервера кажется мне одним из лучших вариантов. Я также не могу позволить себе роскошь заставлять создателя указывать лучшие пути.
Это предложение, которое я сделал в комментариях, кажется, делает почти правильную вещь:
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.