Я хочу настроить карту перенаправления, подобную этой 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 - возвращает значение из переменной и проверяет, есть ли у него значение в файле карты. Если да, то это значение используется для перенаправления.