Estou usando haproxy 1.7.8.
Eu tenho uma configuração que bloqueia solicitações com alguns domínios de abusadores específicos no cabeçalho HTTP Referer.
Partes importantes da minha configuração do haproxy são assim:
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
...com nginx realmente ouvindo em 8091 e servindo algum HTML.
Isso funciona, eu testei definindo este cabeçalho HTTP no meu navegador/curl e fazendo uma solicitação ao meu haproxy - estou obtendo 418.
O problema é que meus logs haproxy se parecem com isso:
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"
...com o código de status 200 registrado, em vez de 418.
Por que isso acontece?
ATUALIZAÇÃO: Observe que espero que o haproxy registre o código de status realmente retornado, porque seu formato de registro HTTP documenta o estado :
- "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.