HAProxy 的 http 请求重定向的多个条件与预期不匹配

HAProxy 的 http 请求重定向的多个条件与预期不匹配

我有一个容器,用于保存一些到第三方服务的礼貌重定向。这是一个 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(主机)条件,并且还尝试在条件之间使用“and”字符串。

由于某种原因,在所有这些不同的变体中,它总是只匹配第一条规则。因此,所有请求,无论是否指定路径,都会转到http://aka.ms/passwordchange

我猜测,像这样的一行程序中的条件可以有多个部分,基于这样的事实:如果它们不能并且只使用第一项,那么在当前版本中它们应该只匹配第三条规则。

感谢您对我可能遗漏的内容提供的帮助和解释。

答案1

这并不意味着您想要表达的意思:

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

字符串匹配接受以空格分隔的多个值,因此这实际上是将请求path任何一个文字字符串 /changehdr(host)-ipasswords.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 }

相关内容