Por que o haproxy registra o código de status 200 ao usar “http-response set-status not-200”?

1

Estou usando o haproxy 1.7.8.

Eu tenho uma configuração que bloqueia solicitações com alguns domínios específicos de usuários abusivos no cabeçalho HTTP Referer.

Partes importantes da minha configuração 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 o nginx realmente ouvindo no 8091 e servindo algum HTML.

Isso funciona, eu testei isso configurando este cabeçalho HTTP no meu navegador / curl e fazendo um pedido para o meu haproxy - estou recebendo 418.


O problema é que meus logs haproxy são parecidos com isto:

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?


UPDATE: Note que espero que o haproxy registre o código de status retornado, porque seu estado dos documentos de formato de log 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.

    
por Greg Dubicki 05.02.2018 / 22:31

2 respostas

1

Funciona como esperado. Seu back-end retorna 200 OK e esse é o status que é registrado. Não faz sentido substituí-los, uma vez que os sysadmins desejam os dados de resposta do backend REAL nos logs para depuração.

"status_code" is the HTTP status code returned to the client

O status é 418 no lado do cliente, e isso funciona corretamente, como Greg escreveu.

    
por 06.02.2018 / 11:00
1

( @Maciej Asembler respondeu corretamente, mas de uma forma que pode não estar completamente clara, então deixe-me tentar reformulá-lo para referência futura.)

Funciona como esperado, pois meu servidor backend retorna 200.

Por quê?

Se você lesse somente esta linha dos documentos:

"status_code" is the HTTP status code returned to the client.

.. então isso seria um bug óbvio de documentação. MAS então segue.

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.

Como nenhum dos casos nesta parte da sentença: "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 sentença é: " Esse status geralmente é definido pelo servidor ".

    
por 07.02.2018 / 15:36

Tags