Come aggiungere intestazioni di risposta con HAproxy 1.6 in base all'URI della richiesta?


9

Uso HAproxy 1.6 come bilanciamento del carico davanti ai server Tomcat.

Devo aggiungere intestazioni di risposta basate sull'URI della richiesta.

Ad esempio, vorrei aggiungere l'intestazione della risposta Cache-Control public,max-age="600"quando l'uri richiesta è /apima non quando l'uri richiesta è qualcos'altro.

  • Il mio primo tentativo è stato utilizzare acl in base al percorso per aggiungere le intestazioni alla risposta http:

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

    Quando inizio haproxy con -d, ho un avviso che dice che path_reg(o path) è incompatibile con 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'
    
  • Ho provato ad aggiungere l'intestazione http-requestinvece di http-response:

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

    Ha funzionato ma ne ho bisogno nella risposta

  • Ho anche provato a usare le variabili 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
    

    Ma quando provo HAproxy non si avvia l'evento e ho il seguente errore:

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

Come posso usare il percorso della richiesta in un acl per impostare l'intestazione della risposta?

Risposte:


9

Prova questo:

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

capture.req.uripersiste fino a quando la risposta non viene elaborata, diversamente pathda ciò che non accade.

Alcune note:

In questo esempio viene utilizzato un ACL anonimo. Potresti anche farlo con un nome ACL, ma questo richiede 2 righe.

Non ho motivo di sapere perché dovresti citare il valore massimo.

Probabilmente non vuoi add-header, vuoi set-header, il che assicura che se uno è già presente, verrà rimosso.

acl path_acl %[var(txn.path)] -m ^/api/(.*)$è probabilmente scritto correttamente come acl path_acl var(txn.path) -m ^/api/(.*)$. HAProxy è un po 'schizzinoso su quando si aspetta %[ ]e quando non lo fa. Sono sicuro che c'è uno schema, ma non sono chiaro solo cosa sia.


1
Grazie per la vostra risposta. Sia metodo utilizzando capture.req.urie variabili durante la rimozione %[ ]in acl̀stanno lavorando. Hai anche ragione sulle virgolette sul max-agevalore e sul set-headerinvece di add-header.
jmlrt,

1
Nota che internamente faccio qualcosa di simile, se il back-end non fornisce una Cache-Controlrisposta: aggiungo Cache-Control-Authority: implicit, gatewayun'intestazione per dare allo sviluppatore / strumento di risoluzione dei problemi / tester un avviso che io, il proxy, sto fornendo quell'intestazione, non l'applicazione , ma l'app può disabilitarmi semplicemente fornendo la propria intestazione. Nota che questa intestazione non è standard: l'ho appena inventata per aiutare gli altri membri del team a sapere che stavo fornendo questo in linea, non l'app. I proxy sono così privi di problemi che hanno la cattiva abitudine di dimenticare di essere sul percorso.
Michael - sqlbot,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.