Redirect

HAProxy 1.6 使用 http-response、map 和 regsub 重定向

  • September 5, 2017

我想設置一個類似於此的重定向映射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 }

我嘗試使用regsubcapture.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?我嘗試使用pathcapture.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 還引入了使用者變數,如果在事務 ( ) 範圍內使用,這些變數可用於從請求端傳送數據。

在請求處理期間,將pathfetch 的內容儲存在一個名為 (巧合) 的事務範圍變數中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 - 從變數中取回值並檢查它是否在映射文件中具有值。如果是這樣,則該值用於重定向。

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