如何根据请求 URI 使用 HAproxy 1.6 添加响应标头?

如何根据请求 URI 使用 HAproxy 1.6 添加响应标头?

我使用 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 对于何时期望何时不期望有些挑剔%[ ]。我确信其中有规律,但我不清楚它到底是什么。

相关内容