Я хочу создать конфигурацию haproxy, которая прослушивает порт 80 и:
use_backend, когда путь начинается с /.well-known/acme-challenge, независимо от домена
перенаправить 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