2016-09-05 59 views
1

是否可以設置一個動態變量來保存HTTP頭的內容,例如主機/ X-Forwarded-Host,稍後會在ACL中使用?如何在HAProxy中設置動態變量?

frontend web1 
    # ... 
    set-var s1(Host) 
    acl site1 hdr_end(host) -i %[s1] 
    # ... 
    use_backend %[s1] if site1 
+0

什麼版本的HAproxy? – mwp

+0

我正在使用1.6.3 – aristit

回答

1

這裏有一些技巧。您根本不需要變量來根據主機地址設置ACL,並使用這些ACL選擇後端。這將是簡單的像這樣:

frontend web1 
    # ... 
    acl site1 hdr(host) -i example.com 
    acl site2 hdr(host) -i example.net 
    # ... 
    use_backend com if site1 
    use_backend net if site2 

這就是你想要做的,或者你是否想要完成更復雜的事情?

UPDATE:下面是如何基於主機頭選擇一個後端:

frontend web1 
    # .. 
    http-request set-var(req.s1) req.hdr(Host),field(1,:),lower,regsub(\.,_,g) 
    use_backend %[var(req.s1)] 

backend example_com 
    # .. 

backend example_net 
    # .. 

這將設置一個變量,它是在該請求的上下文中有效,使用小寫Host頭部,並與週期值替換爲下劃線。事實上,你甚至不需要一個變量:

frontend web1 
    # .. 
    use_backend %[req.hdr(Host),field(1,:),lower,regsub(\.,_,g)] 

HAProxy的將返回503,如果該主機頭相匹配後端無法找到。如果你想要這樣的請求去別的地方,我可以設置一個default_backend(我測試過這個,至少在1.6.3中有效)。

+0

這不是關於一些應用程序/網站的列表。可能有多個未知的「後端」。所有請求應該動態重定向到HTTP主機頭(IP /域)。 – aristit

+0

@aristit好吧,所有的後端都必須在運行時在haproxy.cfg中枚舉,所以你不能有任何「未知」的後端。您需要根據已知後端列表檢查Host標頭,以防止HAproxy嘗試使用不存在的後端。更大的問題是我不確定你可以插入一個變量作爲'use_backend'的第一個參數。我會玩它... – mwp

+0

@aristit這並不像我想的那樣糟糕!看一看,看看這是否符合您的需求。 – mwp