
У меня есть контейнер, который я использую для хранения некоторых любезных перенаправлений на сторонние сервисы. Это контейнер HAproxy с несколькими строками http-запросов в нем. Большинство из них — это один hdr(хост) для перенаправления.
В Azure есть 3 разных URL-адреса для управления паролями. Я пытаюсь поместить их все в один 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/passwordchange.
Я предполагаю, что условия в таком однострочном коде могут состоять из нескольких частей, исходя из того факта, что если они не могут и используют только первый элемент, то в текущей версии они должны соответствовать только третьему правилу.
Спасибо за любую помощь и объяснение того, что я мог здесь упустить.
решение1
Это не означает то, что вы имели в виду:
{ path /change hdr(host) -i passwords.example.com }
Соответствия строк принимают несколько значений, разделенных пробелом, поэтому это фактически сравнение запроса path
слюбая из буквенных строк /change
или hdr(host)
или -i
или passwords.example.com
что совсем не то, что вы имели в виду... но это объясняет, почему HAProxy не считает это синтаксической ошибкой, хотя в принципе это так.
Вы тестируете две несвязанные вещи, поэтому вам нужны два анонимных ACL:
{ path /change } { hdr(host) -i passwords.example.com }
«И» между ними подразумевается.
Ваша конфигурация должна выглядеть так:
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 }