我正在使用 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.