我使用 HAproxy 1.6 作为 tomcat 服务器前面的负载平衡器。
我需要根据请求 URI 添加响应标头。
Cache-Control public,max-age="600"
例如,当请求 uri 是时我想添加响应标头,/api
但是当请求 uri 是其他时则不想添加。
我的第一次尝试是使用基于路径的 acl 将标头添加到 http-response:
acl api path_reg ^/api/(.*)$ http-response add-header Cache-Control public,max-age="600" if api
当我使用 启动 haproxy 时
-d
,出现警告,提示path_reg
(或path
)与 不兼容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'
我尝试添加标题
http-request
而不是http-response
:acl api path_reg ^/api/(.*)$ http-request add-header Cache-Control public,max-age="600" if api
这有效,但我需要在响应中
我也尝试使用 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
但是当我尝试时,HAproxy 甚至没有启动,并且出现以下错误:
[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)]'.
如何使用请求路径进入 acl 来设置响应标头?
答案1
尝试这个:
http-response set-header Cache-Control no-cache,\ max-age=600 if { capture.req.uri -m beg /api/ }
capture.req.uri
持续存在,直到响应被处理为止,而与 不同path
, 则不会。
几点说明:
此示例使用匿名 ACL。您也可以使用命名 ACL,但这需要 2 行。
我不知道为什么你应该引用 max-age 值。
您可能不想add-header
,您想要set-header
,这确保如果已经存在,它将被删除。
acl path_acl %[var(txn.path)] -m ^/api/(.*)$
正确的写法可能是acl path_acl var(txn.path) -m ^/api/(.*)$
。HAProxy 对于何时期望何时不期望有些挑剔%[ ]
。我确信其中有规律,但我不清楚它到底是什么。