Como adicionar cabeçalhos de resposta com o HAproxy 1.6 com base no URI da solicitação?

9

Eu uso o HAproxy 1.6 como balanceador de carga na frente de servidores tomcat.

Preciso adicionar cabeçalhos de resposta com base no URI da solicitação.

Por exemplo, eu gostaria de adicionar o cabeçalho da resposta Cache-Control public,max-age="600"quando a uri da solicitação é, /apimas não quando a uri da solicitação é outra coisa.

  • Minha primeira tentativa foi usar acl com base no caminho para adicionar os cabeçalhos à resposta http:

    acl api path_reg ^/api/(.*)$
    http-response add-header Cache-Control public,max-age="600" if api
    

    Quando inicio a haproxy -d, tenho um aviso dizendo que path_reg(ou path) é incompatível com http-response:

    Dec  6 15:22:29 ip-10-30-0-196 haproxy-systemd-wrapper[315]: 
    [WARNING] 340/152229 (2035) : parsing 
    [/etc/haproxy/haproxy.cfg:78] : acl 'api' will never match because 
    it only involves keywords that are incompatible with 'backend 
    http-response header rule'
    
  • Eu tentei adicionar o cabeçalho em http-requestvez de http-response:

    acl api path_reg ^/api/(.*)$
    http-request add-header Cache-Control public,max-age="600" if api
    

    Isso funcionou, mas eu preciso disso na resposta

  • Eu também tentei usar variáveis ​​haproxy:

    http-request set-var(txn.path) path
    acl path_acl %[var(txn.path)] -m ^/api/(.*)$
    http-response add-header Cache-Control public,max-age="600" if path_acl
    

    Mas quando tento o HAproxy, o evento não inicia e tenho o seguinte erro:

    [ALERT] 340/162647 (2241) : parsing [/etc/haproxy/haproxy.cfg:48] 
    : error detected while parsing ACL 'path_acl' : unknown fetch 
    method '%[var' in ACL expression '%[var(txn.path)]'.
    

Como posso usar o caminho da solicitação em uma ACL para definir o cabeçalho da resposta?

jmlrt
fonte

Respostas:

9

Tente o seguinte:

http-response set-header Cache-Control no-cache,\ max-age=600 if { capture.req.uri -m beg /api/ }

capture.req.uripersiste até que a resposta seja processada, diferentemente do pathque não ocorre.

Algumas notas:

Este exemplo usa uma ACL anônima. Você também pode fazer isso com uma ACL nomeada, mas isso leva duas linhas.

Não há razão para eu saber por que você deve citar o valor da idade máxima.

Você provavelmente não deseja add-header, deseja set-header, o que garante que, se já estiver presente, ele será removido.

acl path_acl %[var(txn.path)] -m ^/api/(.*)$provavelmente está escrito corretamente como acl path_acl var(txn.path) -m ^/api/(.*)$. HAProxy é um pouco meticuloso sobre quando espera %[ ]e quando não espera . Tenho certeza de que há um padrão, mas não estou claro exatamente o que é.

Michael - sqlbot
fonte
1
Obrigado pela sua resposta. Ambos método usando capture.req.urie variáveis ao remover %[ ]em acl̀estão trabalhando. Você também está certo sobre as aspas relacionadas ao max-agevalor e ao set-headerinvés de add-header.
jmlrt
1
Observe que internamente, faço algo semelhante, se o back-end não fornecer uma Cache-Controlresposta: adiciono um Cache-Control-Authority: implicit, gatewaycabeçalho para fornecer ao desenvolvedor / solucionador de problemas / testador um aviso de que eu, o proxy, estou fornecendo esse cabeçalho, não o aplicativo , mas o aplicativo pode me desativar simplesmente fornecendo seu próprio cabeçalho. Observe que esse cabeçalho não é nada padrão - acabei de inventar, para ajudar os outros membros da equipe a saberem que eu estava fornecendo isso em linha, não o aplicativo. Os proxies são tão livres de problemas que eles têm o mau hábito de esquecer que estão no caminho.
Michael - sqlbot