HAProxy 1.6 使用 http-response、map 和 regsub 重定向
我想設置一個類似於此的重定向映射https://stackoverflow.com/questions/23001799/how-do-i-used-the-map-feature-in-haproxy-to-build-massive-redirect-tables- 1-5
不同之處在於我想使用
http-response
而不是http-request
. 原因是因為我只想在後端伺服器返回 404 時重定向。這是我的配置
http-response redirect location %[capture.req.uri,regsub(\?(.*),),map(/etc/haproxy/redirects.map)] code 301 if { status 404 } { capture.req.uri,regsub(\?(.*),),map(/etc/haproxy/redirects.map) -m found }
我嘗試使用
regsub
從capture.req.uri
. 但是,重新啟動 HAProxy 時出現此錯誤。
[ALERT] 280/171612 (6176) : parsing [/etc/haproxy/haproxy.cfg:87] : error detected in proxy 'http' while parsing 'http-response redirect' rule : error in condition: invalid arg 2 in conv method 'regsub' : missing arguments (got 1/2), type 'string' expected in ACL expression 'capture.req.uri,regsub(\?(.*),),map(/etc/haproxy/redirects.map)'. [ALERT] 280/171612 (6176) : Error(s) found in configuration file : /etc/haproxy/haproxy.cfg Errors found in configuration file, check it with 'haproxy check'.
有沒有辦法在沒有查詢參數的情況下獲取 URL?我嘗試使用
path
,capture.req.uri
但 HAProxy 不會啟動。這是我使用的配置
path
http-response redirect location %[path,map(/etc/haproxy/redirects.map)] code 303 if { status 404 } { path,map(/etc/haproxy/redirects.map) -m found }
這是警告
[WARNING] 283/090721 (2875) : parsing [/etc/haproxy/haproxy.cfg:88] : 'redirect' : sample fetch <path,map(/etc/haproxy/redirects.map)> may not be reliably used here because it needs 'HTTP request headers' which is not available here. [WARNING] 283/090721 (2875) : parsing [/etc/haproxy/haproxy.cfg:88] : anonymous acl will never match because it uses keyword 'path' which is incompatible with 'backend http-response header rule'
最初的問題是 的問題
regsub(\?(.*),)
,這導致了一個問題,因為regsub
轉換器僅限於配置解析器可以處理的表達式 - 並且括號不可用,因為解析器認為)
關閉regsub()
的參數太少。(對於文字,您可以使用\\xnn
十六進制轉義符來解決解析器的限制,但這在這裡不起作用。)
regsub
正在使用,因為在響應處理期間觸發了此重定向if { status 404 }
,並且在該path
處理階段無法獲取 - HAProxy 在將請求發送到伺服器後釋放用於請求的緩衝區。
txn
但是,HAProxy 1.6 還引入了使用者變數,如果在事務 ( ) 範圍內使用,這些變數可用於從請求端傳送數據。在請求處理期間,將
path
fetch 的內容儲存在一個名為 (巧合) 的事務範圍變數中path
。http-request set-var(txn.path) path
然後,可以在響應處理期間訪問它。
為清楚起見,以下內容以多行顯示,但必須在單行配置中。
http-response redirect location %[var(txn.path),map(/etc/haproxy/redirects.map)] code 303 if { status 404 } { var(txn.path),map(/etc/haproxy/redirects.map) -m found }
這 - 如果響應狀態程式碼是 404 - 從變數中取回值並檢查它是否在映射文件中具有值。如果是這樣,則該值用於重定向。