Назад | Перейти на главную страницу

Перенаправление HAProxy 1.6 с использованием http-ответа, карты и regsub

Я хочу настроить карту перенаправления, подобную этой https://stackoverflow.com/questions/23001799/how-do-i-used-the-map-feature-in-haproxy-to-build-massive-redirect-tables-1-5

Разница в том, что я хочу использовать http-response вместо того http-request. Причина в том, что я хочу перенаправить только когда внутренний сервер возвращает 404.

Это мой конфиг

http-response redirect location %[capture.req.uri,regsub(\?(.*),),map(/etc/haproxy/redirects.map)] code 301 if { status 404 } { capture.req.uri,regsub(\?(.*),),map(/etc/haproxy/redirects.map) -m found }

Я пытался использовать regsub удалить параметры запроса из capture.req.uri. Но я получаю эту ошибку при перезапуске HAProxy.

[ALERT] 280/171612 (6176) : parsing [/etc/haproxy/haproxy.cfg:87] : error detected in proxy 'http' while parsing 'http-response redirect' rule : error in condition: invalid arg 2 in conv method 'regsub' : missing arguments (got 1/2), type 'string' expected in ACL expression 'capture.req.uri,regsub(\?(.*),),map(/etc/haproxy/redirects.map)'. [ALERT] 280/171612 (6176) : Error(s) found in configuration file : /etc/haproxy/haproxy.cfg Errors found in configuration file, check it with 'haproxy check'.

Есть ли способ получить URL без параметров запроса? Я пытался использовать path вместо того capture.req.uri но HAProxy не запускается.

Это моя конфигурация, использующая path http-response redirect location %[path,map(/etc/haproxy/redirects.map)] code 303 if { status 404 } { path,map(/etc/haproxy/redirects.map) -m found }

И это предупреждение

[WARNING] 283/090721 (2875) : parsing [/etc/haproxy/haproxy.cfg:88] : 'redirect' : sample fetch <path,map(/etc/haproxy/redirects.map)> may not be reliably used here because it needs 'HTTP request headers' which is not available here. [WARNING] 283/090721 (2875) : parsing [/etc/haproxy/haproxy.cfg:88] : anonymous acl will never match because it uses keyword 'path' which is incompatible with 'backend http-response header rule'

Первоначальная проблема была связана с regsub(\?(.*),), что вызвало проблему, потому что regsub преобразователь ограничен выражениями, которые может обрабатывать анализатор конфигурации, а скобки использовать нельзя, потому что анализатор видит ) как закрытие regsub() слишком мало аргументов. (Для литералов вы можете использовать \\xnn hex-escape для обхода ограничений парсера, но здесь это не сработает.)

regsub использовалось, потому что это перенаправление запускается во время обработки ответа if { status 404 }, а path выборка недоступна на этом этапе обработки - HAProxy освобождает буферы, используемые запросом, после его отправки на сервер.

Однако HAProxy 1.6 также вводит пользовательские переменные, которые можно использовать для передачи данных со стороны запроса, если они используются в транзакции (txn) объем.

Во время обработки запроса сохраните содержимое path получить в переменной области транзакции, называемой (случайно) path.

http-request set-var(txn.path) path

Затем к нему можно будет получить доступ во время обработки ответа.

Следующее показано в нескольких строках для ясности, но должно быть в одной строке конфигурации.

http-response redirect 
    location %[var(txn.path),map(/etc/haproxy/redirects.map)] 
    code 303 
    if { status 404 } { var(txn.path),map(/etc/haproxy/redirects.map) -m found }

Это - если код состояния ответа - 404 - возвращает значение из переменной и проверяет, есть ли у него значение в файле карты. Если да, то это значение используется для перенаправления.