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, /api
aber 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 , dasspath_reg
(oderpath
) nicht kompatibel ist mithttp-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-request
anstatthttp-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?
quelle
capture.req.uri
und Variablen beim Entfernen%[ ]
inacl̀
arbeiten. Sie haben auch Recht mit den Anführungszeichen ummax-age
Wert undset-header
anstelle vonadd-header
.Cache-Control
Antwort liefert : Ich füge einenCache-Control-Authority: implicit, gateway
Header 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.