haproxy como processar /.well- known antes de qualquer redirecionamento?

1

Eu quero criar uma configuração haproxy que ouça na porta 80 e:

  1. use_backend quando o caminho começa com /.well-known/acme-challenge, independentemente do domínio

  2. redirecionar http para https para outros caminhos para vários domínios, por exemplo, a.test para link

Eu tentei esta configuração:

use_backend certbot_80 if { path -m reg ^/.well-known/acme-challenge/ } 
redirect prefix https://a.test if { hdr_reg(host) '^a\.test(?::.*)?$' }

Mas isso não funciona porque o haproxy processa o redirecionamento antes de use_backend.

Isso funciona:

acl certbot path -m reg ^/.well-known/acme-challenge/
redirect prefix https://a.test if ! certbot { hdr_reg(host)  '^a\.test(?::.*)?$' }
use_backend certbot_80 if certbot

Mas tenho de excluir especificamente a condição do certbot em cada redirecionamento. E se eu tiver mais caminhos que desejo manipular primeiro, precisarei excluir todos eles em cada redirecionamento.

Existe uma maneira de fazer isso enquanto mantém cada condição separada das outras?

Anteriormente, eu estava usando o libra, que processava redirecionamentos mistos e back-ends em ordem.

    
por user13097 08.11.2018 / 10:13

1 resposta

1

Temo que não seja possível processar use_backend antes das declarações redirect . Acredito que o HAPROXY avalie os redirecionamentos após receber toda a solicitação HTTP do cliente e escolher um back-end somente depois de descobrir que o cliente não será redirecionado.

Você não precisa modificar todas as regras de redirecionamento para adicionar outros caminhos de exclusão. Você pode usar uma ACL exclusiva. Por exemplo, esse snippet de configuração funcionaria:

acl noredirects path -m reg ^/.well-known/acme-challenge/
acl noredirects path -m beg /static/ /images/ /css/
acl noredirects req.hdr(host) -i httpsite.example.com
redirect prefix https://a.test if ! noredirects { req.hdr(host) -m reg ^a\.test(?::.*)?$ }
use_backend certbot_80 if noredirects

Você também pode processar redirecionamentos em um back-end. Por exemplo:

frontend http *:80
    acl certbot  path -m beg /.well-known/acme-challenge/
    acl httpsite path -m beg /public/
    use_backend certbot_80 if certbot
    use_backend httpbackend if httpsite
    default_backend redirector

backend redirector
    redirect prefix https://a.test if { req.hdr(host) -m reg ^a\.test(?::.*)?$ }
    redirect prefix https://b.test if { req.hdr(host) -m reg ^b\.test(?::.*)?$ }

backend httpbackend
    server httpserver httpserver.example.com:80
    
por 08.11.2018 / 18:00

Tags