
我有一個容器,用於保存一些到第三方服務的禮貌重定向。它是一個 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 }