Haproxy
http-request 重定向的 HAProxy 多個條件與預期不匹配
我有一個容器,用於保留一些對 3rd 方服務的禮貌重定向。它是一個 HAproxy 容器,其中包含多個 http-request 行。大多數是要重定向的單個 hdr(host)。
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。
我猜測像這樣的一個襯里中的條件可以有多個部分,基於這樣一個事實,如果他們不能並且只使用第一個項目,那麼在目前版本中它們應該只匹配第三條規則。
感謝您對我在這裡可能遺漏的內容的任何幫助和解釋。
這並不意味著您的意思:
{ path /change hdr(host) -i passwords.example.com }
字元串匹配接受由空格分隔的多個值,因此這實際上是將請求
path
與任何一個文字字元串/change
或hdr(host)
or-i
or進行比較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 }