我使用HAproxy 1.6作为tomcat服务器之前的负载平衡器。
我需要添加基于请求URI的响应头。
例如,当请求uri是/api
时,我想添加响应头部Cache-Control public,max-age="600"
,而当请求uri是别的东西时,则不会。
我第一次尝试使用基于path的ACL来添加标头到http-response:
acl api path_reg ^/api/(.*)$ http-response add-header Cache-Control public,max-age="600" if api
当我用-d
启动haproxy时,我警告说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
这工作,但我需要在响应
我也尝试使用haproxyvariables:
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)]'.
我如何使用请求path到一个acl来设置响应头?
尝试这个:
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行。
我没有理由知道你为什么要引用最大年龄值。
你可能不想add-header
,你想要set-header
,这确保如果已经存在,它将被删除。
acl path_acl %[var(txn.path)] -m ^/api/(.*)$
可能正确写成acl path_acl var(txn.path) -m ^/api/(.*)$
。 当HAProxy期待%[ ]
时,HAProxy有点挑剔。 我确定有一个模式,但我不清楚是什么。