最初に要求されたリソースの絶対アドレスを含むカスタムヘッダーを追加する方法


11

次のセットアップがあります。

                 |-------|--- backend1:8080
example.com:80---|HAProxy|--- backend2:8080
                 |-------|--- backend3:8080

元のURLを含むカスタムヘッダーを追加するようにHAProxyを構成したいと思います。たとえば、ユーザーがリクエストする場合http://example.com/foo?bar=baz、つまり:

GET /foo?bar=baz HTTP/1.1
Host: example.com:80

HAProxyがこのリクエストをバックエンドに変換するようにしたいと思います。

GET /foo?bar=baz HTTP/1.1
Host: backend1:8080
x-custom-header: http://example.com/foo?bar=baz

このreqaddオプションでは、静的な値を持つヘッダーのみを追加できます。を使用してリクエストからパス部分を取得できましたreqrep

reqrep ^([^\ ]*)\ ([^\ ]*)\ (HTTP\/1\.[10])  \0\r\nx-custom-header:\ \2

ただし、残念ながら、これは元のURLのパス部分のみをキャプチャし、次のヘッダーを生成します。

x-custom-header: /foo?bar=baz

したがって、私の質問は、HAProxy 1.4でHost HTTPリクエストのヘッダーと最初の行の両方をカスタムヘッダーに結合できるかどうかです。


(backend-id)reqaddを参照するacl と組み合わせてみましたbe_idか?それは正確に動的ではありませんが、バックエンドの数が少ない場合に近づく可能性があります... reqirepオプションのaclもサポートしているので、バックエンドごとに別々の正規表現を書くことができます。 id。
マイケル-sqlbot

回答:


18

簡単な答え:いいえ、HAProxy 1.4ではこれはできません。


ただし、1.5 +でこの質問を見つけた場合:

HAProxy 1.5+では、%[variable]構文を介して変数を参照でき、静的な文字列の使用のみに制限されていません。HAProxy構成ガイドのセクション7.3で、どの変数が既に存在するかを確認できます(具体的には、レイヤー7変数の7.3.6)。

あなたの場合、あなたはurlこのようにrawを見ています:

http-request set-header X-Custom-Header %[url]

1
1.4ではこれが不可能であるという私の結論を確認していただきありがとうございます。に切り替えましたnginx
ダリンディミトロフ14年

%[url]は常に完全なURLであるとは限りませんが、haproxyが実行できる最高のURLのようです。haproxy 1.8 URL変数ドキュメント:cbonte.github.io/haproxy-dconv/1.8/configuration.html#7.3.6-url
zie
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.