HAProxy 1.6 redirecionar usando http-response, map e regsub

2

Desejo configurar um mapa de redirecionamento semelhante a este

A diferença é que eu quero usar http-response em vez de http-request . A razão disso é porque eu quero redirecionar somente quando o servidor de backend retorna 404.

Esta é minha configuração

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 }

Eu tentei usar regsub para remover parâmetros de consulta de capture.req.uri . Mas, eu recebo esse erro ao reiniciar o 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'.

Existe uma maneira de obter o URL sem parâmetros de consulta? Eu tentei usar path em vez de capture.req.uri , mas o HAProxy não iniciará.

Esta é minha configuração usando path http-response redirect location %[path,map(/etc/haproxy/redirects.map)] code 303 if { status 404 } { path,map(/etc/haproxy/redirects.map) -m found }

E este é o aviso

[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'

    
por Rudy Lee 07.10.2016 / 08:19

1 resposta

1

O problema original foi um problema com regsub(\?(.*),) , que causou um problema porque o conversor regsub está limitado a expressões que o analisador de configuração pode manipular - e parênteses não são utilizáveis porque o analisador vê o ) como fechando regsub() com poucos argumentos. (Para literais, você pode usar \xnn hex-escapes para contornar as limitações do analisador, mas isso não funcionaria aqui.)

regsub estava sendo usado porque esse redirecionamento está sendo acionado durante o processamento da resposta if { status 404 } , e a path fetch não está disponível nesse estágio de processamento - o HAProxy libera os buffers usados pela solicitação quando ela é enviado para um servidor.

No entanto, o HAProxy 1.6 também introduz variáveis de usuário que podem ser usadas para transportar dados do lado da solicitação, se usados no escopo de transação ( txn ).

Durante o processamento da solicitação, armazene o conteúdo da busca path em uma variável com escopo de transação chamada (coincidentemente) path .

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

Em seguida, pode ser acessado durante o processamento da resposta.

O seguinte é mostrado em várias linhas para maior clareza, mas deve estar em uma única linha de configuração.

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 }

Isso - se o código de status da resposta for 404 - recupera o valor da variável e verifica se ele tem um valor no arquivo de mapeamento. Em caso afirmativo, esse valor é usado para o redirecionamento.

    
por 10.10.2016 / 04:22