Haproxy

http-request 重定向的 HAProxy 多個條件與預期不匹配

  • July 27, 2019

我有一個容器,用於保留一些對 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任何一個文字字元串 /changehdr(host)or -ior進行比較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 }

引用自:https://serverfault.com/questions/976748