Один и тот же frontend в HAProxy часто обслуживает сразу несколько доменов, и разводить их по backend удобнее не по пути запроса, а по заголовку Host:

frontend https_in
    bind *:443
    acl host_api    hdr(host) -i api.example.com
    acl host_admin  hdr(host) -i admin.example.com
    use_backend api_servers   if host_api
    use_backend admin_servers if host_admin
    default_backend web_servers

Флаг -i делает сравнение регистронезависимым — без него API.example.com и api.example.com считаются разными хостами, что почти никогда не то, что нужно.

ACL можно комбинировать: несколько условий через пробел работают как AND, через запятую — как OR. Пригождается, когда правило должно учитывать не только хост, но и источник запроса — например, пускать админку только из офисной подсети:

acl from_office src 192.168.10.0/24 10.0.0.0/8
acl host_admin  hdr(host) -i admin.example.com
http-request deny if host_admin !from_office

Здесь !from_office — отрицание: правило сработает, если запрошен хост админки, а IP источника не входит в разрешённые подсети. Порядок объявления ACL в конфиге не важен, важен порядок строк if/unless — они выполняются сверху вниз, и первое совпавшее правило deny или use_backend останавливает обработку.

#haproxy #networking