web-dev-qa-db-ja.com

リクエストURIに基づいてHAproxy 1.6でレスポンスヘッダーを追加する方法

Tomcatサーバーの前のロードバランサーとしてHAproxy 1.6を使用しています。

リクエストURIに基づいて応答ヘッダーを追加する必要があります。

たとえば、リクエストuriがCache-Control public,max-age="600"の場合はレスポンスヘッダー/apiを追加しますが、リクエストuriが別の場合は追加しません。

  • 私の最初の試みは、ヘッダーをhttp-responseに追加するためにパスに基づいてACLを使用することでした:

    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
    

    それはうまくいったが、私は応答でそれを必要とする

  • 私も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への要求パスを使用して応答ヘッダーを設定するにはどうすればよいですか?

9
jmlrt

これを試して:

_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は、_%[ ]_を予期する場合と予期しない場合について、少し注意が必要です。確かにパターンはあると思いますが、何なのかはわかりません。

9