Назад | Перейти на главную страницу

haproxy, как обрабатывать /.well-known перед любыми перенаправлениями?

Я хочу создать конфигурацию haproxy, которая прослушивает порт 80 и:

  1. use_backend, когда путь начинается с /.well-known/acme-challenge, независимо от домена

  2. перенаправить http на https для других путей для нескольких доменов, например а. тест на https: //a.test

Я пробовал такую ​​конфигурацию:

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

Но это не работает, потому что процессы haproxy перенаправляют перед use_backend.

Это работает:

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

Но я должен специально исключать условие certbot в каждом перенаправлении. И если у меня есть больше путей, которые я хочу обработать в первую очередь, мне придется исключать их все в каждом перенаправлении.

Есть ли способ сделать это, сохраняя при этом каждое условие отдельно от других?

Раньше я использовал pound, который обрабатывал смешанные перенаправления и бэкенды по порядку.

Боюсь, это невозможно обработать use_backend перед redirect заявления. Я считаю, что HAPROXY оценивает перенаправления после получения всего HTTP-запроса от клиента и выбирает бэкэнд только после того, как обнаруживает, что клиент не будет перенаправлен.

Вам не нужно изменять каждое правило перенаправления, чтобы добавить дополнительные пути исключения. Вместо этого вы можете использовать уникальный ACL. Например, этот фрагмент конфигурации будет работать:

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

Вы также можете обрабатывать перенаправления на бэкэнде. Например:

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