![HAProxy 的 http 请求重定向的多个条件与预期不匹配](https://linux22.com/image/740647/HAProxy%20%E7%9A%84%20http%20%E8%AF%B7%E6%B1%82%E9%87%8D%E5%AE%9A%E5%90%91%E7%9A%84%E5%A4%9A%E4%B8%AA%E6%9D%A1%E4%BB%B6%E4%B8%8E%E9%A2%84%E6%9C%9F%E4%B8%8D%E5%8C%B9%E9%85%8D.png)
我有一个容器,用于保存一些到第三方服务的礼貌重定向。这是一个 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
与任何一个文字字符串 /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 }