web-dev-qa-db-fra.com

Comment ajouter des en-têtes de réponse avec Haproxy 1.6 basé sur demande URI?

J'utilise haproxy 1.6 comme équilibreur de charge devant des serveurs Tomcat.

Je dois ajouter des en-têtes de réponse en fonction de l'URI de la demande.

Pour par exemple, j'aimerais ajouter l'en-tête de réponse Cache-Control public,max-age="600" Lorsque l'URI de la demande est /api Mais pas quand la demande URI est autre chose.

  • Mon premier essai consistait à utiliser ACL basé sur un chemin pour ajouter les en-têtes à http-réponse:

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

    Quand je commence haproxy avec -d, J'ai averti de dire que path_reg (ou path) est incompatible avec 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'
    
  • J'ai essayé d'ajouter l'en-tête en http-request à la place de http-response:

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

    Cela a fonctionné mais j'en ai besoin dans la réponse

  • J'ai également essayé d'utiliser des variables 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
    

    Mais quand j'essaie Haproxy n'excédant pas l'événement et j'ai l'erreur suivante:

    [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)]'.
    

Comment puis-je utiliser le chemin de demande dans une ACL pour définir l'en-tête de réponse?

9
jmlrt

Essaye ça:

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

capture.req.uri Persiste jusqu'à ce que la réponse soit traitée, contrairement à path, qui ne le fait pas.

Quelques notes:

Cet exemple utilise une ACL anonyme. Vous pouvez également le faire avec une ACL nommée, mais cela prend 2 lignes.

Il n'y a aucune raison que je suis au courant de la raison pour laquelle vous devriez citer la valeur maximale.

Vous ne voulez probablement pas add-header, Vous voulez set-header, Ce qui garantit que si l'on est déjà présent, il sera supprimé.

acl path_acl %[var(txn.path)] -m ^/api/(.*)$ est probablement correctement écrit comme acl path_acl var(txn.path) -m ^/api/(.*)$. Haproxy est un peu finky sur quand il s'attend à ce que %[ ] Et quand ce n'est pas le cas. Je suis sûr qu'il y a un modèle, mais je ne suis pas clair que c'est quoi c'est.

9
Michael - sqlbot