Wie füge ich Antwortheader mit HAproxy 1.6 basierend auf dem Anforderungs-URI hinzu?

9

Ich verwende HAproxy 1.6 als Load Balancer vor Tomcat-Servern.

Ich muss Antwortheader basierend auf dem Anforderungs-URI hinzufügen.

Zum Beispiel möchte ich den Antwortheader hinzufügen, Cache-Control public,max-age="600"wenn die Anforderungs-Uri ist, /apiaber nicht, wenn die Anforderungs-Uri etwas anderes ist.

  • Mein erster Versuch war die Verwendung von acl basierend auf dem Pfad, um die Header zu http-response hinzuzufügen:

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

    Wenn ich mit Haproxy beginne -d, wird die Warnung angezeigt , dass path_reg(oder path) nicht kompatibel ist mit 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'
    
  • Ich habe versucht, den Header hinzuzufügen, http-requestanstatt http-response:

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

    Das hat funktioniert, aber ich brauche es in der Antwort

  • Ich habe auch versucht, Haproxy-Variablen zu verwenden:

    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
    

    Aber wenn ich HAproxy versuche, startet kein Ereignis und ich habe den folgenden Fehler:

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

Wie kann ich den Anforderungspfad in eine ACL verwenden, um den Antwortheader festzulegen?

jmlrt
quelle

Antworten:

9

Versuche dies:

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

capture.req.uribleibt bestehen, bis die Antwort verarbeitet wird, im Gegensatz dazu path, was nicht der Fall ist.

Ein paar Anmerkungen:

In diesem Beispiel wird eine anonyme ACL verwendet. Sie können dies auch mit einer benannten ACL tun, dies erfordert jedoch zwei Zeilen.

Es gibt keinen Grund, warum ich den Maximalalterwert angeben sollte.

Sie möchten wahrscheinlich nicht add-header, Sie möchten set-header, was sicherstellt, dass eine bereits vorhandene entfernt wird, wenn sie bereits vorhanden ist.

acl path_acl %[var(txn.path)] -m ^/api/(.*)$ist wahrscheinlich richtig geschrieben als acl path_acl var(txn.path) -m ^/api/(.*)$. HAProxy ist ein wenig pingelig, wann es erwartet %[ ]und wann nicht. Ich bin mir sicher, dass es ein Muster gibt, aber mir ist nicht klar, was es ist.

Michael - sqlbot
quelle
1
Danke für Ihre Antwort. Beide Verfahren verwenden capture.req.uriund Variablen beim Entfernen %[ ]in acl̀arbeiten. Sie haben auch Recht mit den Anführungszeichen um max-ageWert und set-headeranstelle von add-header.
jmlrt
1
Beachten Sie, dass ich intern etwas Ähnliches mache, wenn das Back-End keine Cache-ControlAntwort liefert : Ich füge einen Cache-Control-Authority: implicit, gatewayHeader hinzu, um dem Entwickler / Problemlöser / Tester ein Heads-up zu geben, das ich als Proxy diesen Header und nicht die Anwendung bereitstelle , aber die App kann mich deaktivieren, indem sie einfach einen eigenen Header bereitstellt. Beachten Sie, dass dieser Header kein Standard ist. Ich habe ihn nur erfunden, damit andere im Team wissen, dass ich diesen Inline-Code und nicht die App bereitgestellt habe. Die Proxies sind so störungsfrei, dass sie die schlechte Angewohnheit haben, zu vergessen, dass sie überhaupt auf dem Weg sind.
Michael - sqlbot