Várias condições do HAProxy para redirecionamento de solicitação http não correspondem ao esperado

Várias condições do HAProxy para redirecionamento de solicitação http não correspondem ao esperado

Eu tenho um contêiner que uso para manter alguns redirecionamentos de cortesia para serviços de terceiros. É um contêiner HAproxy com várias linhas de solicitação http. A maioria é um único HDR (host) para redirecionar.

O Azure tem 3 URLs diferentes para gerenciamento de senhas. Estou tentando colocar todas elas em uma URL com caminhos diferentes para redirecionar para páginas diferentes.

Isso é o que tenho agora:

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 }

Também tentei primeiro com a condição hdr(host) e também tentei com uma string 'e' entre as condições.

Por alguma razão, em todas essas diferentes variações, sempre corresponde apenas à primeira regra. Portanto, todas as solicitações, independentemente de um caminho ser especificado, vão parahttp://aka.ms/passwordchange.

Suponho que as condições em um liner como este podem ter várias partes com base no fato de que, se não pudessem e usassem apenas o primeiro item, na versão atual elas deveriam corresponder apenas à terceira regra.

Obrigado por qualquer ajuda e explicação sobre o que posso estar faltando aqui.

Responder1

Isso não significa o que você pretendia que significasse:

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

As correspondências de string aceitam vários valores separados por um espaço, portanto, na verdade, isso é uma comparação da solicitação pathcomqualquer uma das strings literais /changeor hdr(host)or -ior passwords.example.comwhich não é o que você pretendia ... mas isso explica por que o HAProxy não considera isso um erro de sintaxe, embora, em princípio, seja.

Você está testando duas coisas não relacionadas, então precisa de duas ACLs anônimas:

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

O "e" entre os dois está implícito.

Sua configuração deve ficar assim:

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 }

informação relacionada