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.
Funciona como esperado. Seu back-end retorna 200 OK, e este é o status que é registrado. Não faz sentido substituí-los, pois os administradores de sistema desejam os dados de resposta de back-end REAIS em logs para depuração.
O status é 418 no lado do cliente e funciona corretamente como Greg escreveu.
( @Maciej Asembler respondeu corretamente, mas de uma forma que pode não ser completamente clara, então deixe-me tentar reformular para referência futura.)
Funciona como esperado, pois meu servidor de back-end retorna 200.
Por quê?
Se você pudesse ler apenas esta linha dos documentos:
..então isso seria um bug de documentação óbvio. MAS então isso segue.
Como nenhum dos casos nesta parte da frase: "também pode ser definido por haproxy quando o servidor não pode ser alcançado ou quando sua resposta é bloqueada por haproxy" ocorre aqui, a primeira parte da frase faz: "Este status é geralmente definido pelo servidor".