В frontend
секциях, http-request redirect
обрабатывается довольно рано в процессе, поэтому не может сделать что-то подобное (что, похоже, вы уже пытались, но безуспешно) ...
frontend web
use_backend site1 if { hdr(host) -i site1.example.com }
use_backend site2 if { hdr(host) -i site2.example.com }
http-request redirect location https://site1.example.com
HAProxy «разрешает» эту конфигурацию, но она не работает, потому что:
[WARNING] : parsing [/etc/haproxy/haproxy.cfg:xx] : a 'http-request' rule placed after a 'use_backend' rule will still be processed before.
use_backend
правила всегда откладываются до тех пор, пока не обработаны правила http-request
.
Однако HAProxy поддерживает http-request redirect
и в бэкэнд-секциях, так что вы можете отложить интерпретацию http-request redirect
, поместив ее в бэкэнд-секцию, которая существует исключительно для того, чтобы перехватить что-нибудь, не пойманное use_backend
.
Создать «фиктивный» бэкэнд без серверов и правило перенаправления и установить этот новый бэкэнд в качестве бэкенда по умолчанию.
frontend web
use_backend site1 if { hdr(host) -i site1.example.com }
use_backend site2 if { hdr(host) -i site2.example.com }
default_backend catchall
backend catchall
mode http
http-request redirect location https://site1.example.com
# no 'server' declared here
default_backend
используется только при отсутствии use_backend
Заявление было согласовано, после того как все они были рассмотрены. Его можно разместить в любом месте в конфигурации frontend
, поскольку он автоматически оценивается последним, когда нет других возможностей.
catchall
не имеет особого значения. Это просто произвольная метка для этого нового бэкэнда.