HAProxy の http-request リダイレクトの複数の条件が期待どおりに一致しない

HAProxy の http-request リダイレクトの複数の条件が期待どおりに一致しない

サードパーティのサービスへの礼儀正しいリダイレクトを保存するために使用するコンテナーがあります。これは、複数の http-request 行を含む HAproxy コンテナーです。ほとんどは、リダイレクトする単一の hdr (ホスト) です。

Azure にはパスワード管理用の 3 つの異なる URL があり、私はそれらすべてを異なるパスを持つ 1 つの URL 内に配置して、異なるページにリダイレクトしようとしています。

私が今持っているのはこれです:

http-request redirect location http://aka.ms/passwordchange code 301 if { path /change hdr(host) -i passwords.example.com }
http-request redirect location https://aka.ms/sspr code 301 if { path /reset hdr(host) -i passwords.example.com }
http-request redirect location https://aka.ms/setupsecurityinfo code 301 if { hdr(host) -i passwords.example.com }

また、最初に hdr(host) 条件を試し、条件間に 'and' 文字列を入れて試してみました。

何らかの理由で、これらすべての異なるバリエーションでは、常に最初のルールにのみ一致します。そのため、パスが指定されているかどうかに関係なく、すべてのリクエストはhttp://aka.ms/パスワード変更

これができず、最初の項目のみを使用した場合、現在のバージョンでは 3 番目のルールのみに一致するはずであるという事実に基づいて、このような 1 行の条件は複数の部分を持つことができると推測しています。

ここで私が見逃しているかもしれないものについて、ご助力とご説明をいただければ幸いです。

答え1

これはあなたが意図した意味ではありません:

{ path /change hdr(host) -i passwords.example.com }

path文字列の一致はスペースで区切られた複数の値を受け入れるので、これは実際にはリクエストをリテラル文字列のいずれか /changeまたはhdr(host)または-iまたはpasswords.example.comはまったく意図したものではありません...ただし、これは、原則的には構文エラーであるにもかかわらず、HAProxy がこれを構文エラーと見なさない理由を説明しています。

無関係な 2 つのものをテストしているので、2 つの匿名 ACL が必要です。

{ path /change } { hdr(host) -i passwords.example.com }

2 つの間の「and」は暗黙的です。

設定は次のようになります:

http-request redirect location http://aka.ms/passwordchange code 301 if { path /change } { hdr(host) -i passwords.example.com }
http-request redirect location https://aka.ms/sspr code 301 if { path /reset } { hdr(host) -i passwords.example.com }
http-request redirect location https://aka.ms/setupsecurityinfo code 301 if { hdr(host) -i passwords.example.com }

関連情報