我正在使用 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,这是记录的状态。覆盖这些是没有意义的,因为系统管理员希望日志中的实际后端响应数据用于调试。
客户端的状态为 418,正如 Greg 所写的那样,这是正确的。
(@Maciej Asembler回答正确,但可能不完全清楚,所以让我尝试重新措辞以供将来参考。)
它按预期工作,因为我的后端服务器返回 200。
为什么?
如果您只阅读这行文档:
..那么这将是一个明显的文档错误。但接下来就是这样。
由于这部分句子中的任何一种情况:“当服务器无法访问或当它的响应被 haproxy 阻止时,它也可能由 haproxy 设置”在这里发生,句子的第一部分确实:“这个状态是一般由服务器设置”。