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

6

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

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

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

  • Minha primeira tentativa foi usar o 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 o haproxy com -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-request em vez 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 as 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 eu 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 de solicitação em um acl para definir o cabeçalho de resposta?

    
por jmlrt 06.12.2016 / 17:47

1 resposta

7

Tente isto:

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

capture.req.uri persiste até que a resposta seja processada, ao contrário de path , o que 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 2 linhas.

Não há motivo para saber por que você deve citar o valor max-age.

Você provavelmente não deseja add-header , você deseja set-header , o que garante que, se um 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/(.*)$ . O HAProxy é um pouco complicado quando espera %[ ] e quando não. Tenho certeza que há um padrão, mas não estou claro o que é isso.

    
por 06.12.2016 / 23:54