Один и тот же 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
