如何基于请求URI使用HAproxy 1.6添加响应头?


9

我将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中的请求路径来设置响应标头?

Answers:


9

尝试这个:

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对何时期望%[ ]和何时不期望有些挑剔。我确定有一个模式,但是我不清楚是什么。


1
谢谢您的答复。同时使用方法capture.req.uri和变量,同时消除%[ ]acl̀正常工作。您也对max-agevalue 周围的引号和set-header而不是正确add-header
jmlrt 2016年

1
请注意,在内部,如果后端未提供Cache-Control响应,我会做类似的事情:添加Cache-Control-Authority: implicit, gateway标头,以使开发人员/疑难解答者/测试人员可以了解我(代理)提供的标头,而不是应用程序,但该应用可以通过简单地提供其标题来禁用我。请注意,此标头不是标准的,我只是编造出来的,以帮助团队中的其他人意识到我是在提供此内联而不是应用程序。代理是如此无忧无虑,以至于他们有一个坏习惯,那就是完全忘记了自己在路上。
Michael-sqlbot
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.