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


9

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
    

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

回答:


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行かかります。

max-age値を引用する理由を私が知っている理由はありません。

あなたはおそらくしたくないadd-headerあなたがしたい、set-header1がすでに存在する場合、それは削除されることをどの保証します。

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 16

1
内部では、バックエンドがCache-Control応答を提供しない場合、同様のことを行うことに注意してください。Cache-Control-Authority: implicit, gatewayヘッダーを追加して、開発者/トラブルシューティング/テスターに​​、アプリケーションではなく、プロキシであるヘッダーを提供することを伝えます。ただし、アプリは独自のヘッダーを提供するだけで無効にできます。このヘッダーは標準的なものではないことに注意してください。私が作成したのは、アプリではなく、インラインで提供していることをチームの他のメンバーが認識できるようにするためです。プロキシはトラブルがなく、パスにいることを忘れるという悪い癖があります。
マイケル-sqlbot 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.