HAProxy múltiples condiciones para la redirección de solicitud http no coinciden como se esperaba

HAProxy múltiples condiciones para la redirección de solicitud http no coinciden como se esperaba

Tengo un contenedor que uso para guardar algunos redireccionamientos de cortesía a servicios de terceros. Es un contenedor HAproxy con múltiples líneas de solicitud http. La mayoría son un único hdr (host) para redirigir.

Azure tiene 3 URL diferentes para la administración de contraseñas. Estoy intentando colocarlas todas dentro de una URL con diferentes rutas para redirigir a las diferentes páginas.

Esto es lo que tengo ahora mismo:

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 }

También probé primero con la condición hdr(host), y también probé con una cadena 'y' entre las condiciones.

Por alguna razón, en todas estas variaciones diferentes, siempre coincide sólo con la primera regla. Entonces todas las solicitudes, sin importar si se especifica una ruta, van ahttp://aka.ms/contraseñacambiar.

Supongo que las condiciones en una sola línea como esta pueden tener varias partes basándose en el hecho de que si no pudieron y solo usaron el primer elemento, entonces en la versión actual deberían coincidir solo con la tercera regla.

Gracias por cualquier ayuda y explicación de lo que podría estar perdiendo aquí.

Respuesta1

Esto no significa lo que usted pretendía que significara:

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

Las coincidencias de cadenas aceptan múltiples valores separados por un espacio, por lo que en realidad se trata de comparar la solicitud pathconcualquiera de las cadenas literales /changeo hdr(host)o -io passwords.example.comque no es lo que pretendías en absoluto... pero esto explica por qué HAProxy no considera que esto sea un error de sintaxis, aunque en principio lo es.

Estás probando dos cosas no relacionadas, por lo que necesitas dos ACL anónimas:

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

El "y" entre los dos está implícito.

Tu configuración debería verse así:

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 }

información relacionada