为什么 haproxy 在使用“http-response set-status”时记录状态代码 200“?

为什么 haproxy 在使用“http-response set-status”时记录状态代码 200“?

我使用的是 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.

答案1

它按预期工作。您的后端返回 200 OK,这是记录的状态。覆盖这些是没有意义的,因为系统管理员希望日志中的实际后端响应数据用于调试。

“status_code”是返回给客户端的HTTP状态代码

客户端的状态为 418,正如 Greg 所写,这工作正常。

答案2

@Maciej 汇编器回答正确,但方式可能不完全清楚,所以让我尝试重新表述以供将来参考。)

当我的后端服务器返回 200 时,它按预期工作。

为什么?

如果你愿意读只有这一行文档的:

“status_code”是返回给客户端的HTTP状态代码。

..那么这将是一个明显的文档错误。接下来是这样的。

此状态通常由服务器设置,但当无法访问服务器或其响应被 haproxy 阻止时,也可能由 haproxy 设置。

由于这部分句子中的两种情况都没有发生:“当服务器无法到达或当其响应被 haproxy 阻止时,它也可能由 haproxy 设置”,因此该句子的第一部分是:“此状态是一般由服务器设置”。

相关内容