Http

為什麼使用“http-response set-status <not-200>”時haproxy會記錄狀態碼200?

  • February 7, 2018

我正在使用 haproxy 1.7.8。

我有一個配置可以阻止 HTTP Referer 標頭中某些特定濫用者域的請求。

我的 haproxy 配置的重要部分如下所示:

frontend https_l1_xxxxx

   (...)

   acl is_abuser_by_referer capture.req.hdr(7) -m reg -i ^https?:\/\/(.+\.)?(someabuser.com|someabuser2.com|someabuser3.com)(\?.*|\/.*)?$
   acl return_html_path path_beg /urlICareAbout
   use_backend abuser if is_abuser_by_referer return_html_path

backend abuser

   # override standard 200 status code
   http-response set-status 418 reason "I'm a teapot"
   server nginx_abusers localhost:8091

… nginx 實際上在監聽 8091 並提供一些 HTML。

這行得通,我已經通過在瀏覽器/curl 中設置這個 HTTP 標頭並向我的 haproxy 發出請求來測試它 - 我得到 418。

問題是我的 haproxy 日誌看起來像這樣:

Feb 5 13:11:45 aaa-www05 haproxy_l1_xxxxx[38749]: 111.222.111.222:2605 [05/Feb/2018:13:11:44.849] DFDA00BD:0A2D_0A19800C:01BB_--_7BFDAD https_l1_xxxxx ~ abuser/nginx_abusers 280/0/1/0/282 200 6044 - - ---- 145/145/0/0/0 0/0 {e60b039c46a1e104a94558ce0e480654||07.mydomain.com|||Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.5; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET4.0C; .NET||http://someabuser.com/player.swf} {||} 467 "GET /urlICareAbout/?preview=true HTTP/1.1"

…記錄狀態碼 200,而不是 418。

為什麼會這樣?

**更新:**請注意,我希望 haproxy 記錄實際返回的狀態程式碼,因為它的 HTTP 日誌格式文件狀態

- "status_code" is the HTTP status code returned to the client. This status is generally set by the server, but it might also be set by haproxy when the server cannot be reached or when its response is blocked by haproxy.

它按預期工作。您的後端返回 200 OK,這是記錄的狀態。覆蓋這些是沒有意義的,因為系統管理員希望日誌中的實際後端響應數據用於調試。

“status_code”是返回給客戶端的HTTP狀態碼

客戶端的狀態為 418,正如 Greg 所寫的那樣,這是正確的。

@Maciej Asembler回答正確,但可能不完全清楚,所以讓我嘗試重新措辭以供將來參考。)

它按預期工作,因為我的後端伺服器返回 200。

為什麼?

如果您只閱讀這行文件:

“status_code”是返回給客戶端的 HTTP 狀態碼。

..那麼這將是一個明顯的文件錯誤。接下來就是這樣。

此狀態一般由伺服器設置,但也可能在伺服器無法訪問或響應被 haproxy 阻塞時由 haproxy 設置。

由於這部分句子中的任何一種情況:“當伺服器無法到達或它的響應被 haproxy 阻止時,它也可能由 haproxy 設置”在這裡發生,句子的第一部分確實:“這個狀態是一般由伺服器設置”。

引用自:https://unix.stackexchange.com/questions/422128