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

Как сопоставить хост с подстановочными знаками в списках ACL в HAproxy?

В моем haproxy.conf есть следующие строки:

acl valid_domains hdr(Host) -i mysite.com images.mysite.com docs.mysite.com admin.mysite.com
redirect location http://mysite.com/invalid_domain if !valid_domains

Как сопоставить любой поддомен?

Я попытался:

acl valid_domains hdr(Host) -i *.mysite.com

и:

acl valid_domains hdr(Host) -i [a-z]+.mysite.com

... Но ни то, ни другое не сработало.

Спасибо

я чувствую что hdr_sub лучше для ваших нужд. Некоторое время я использовал hdr_end, но столкнулся со следующей проблемой:

запросы с портом 80 обычно удаляют порт, поэтому заголовок хоста выглядит как «example.com», но если вы явно запрашивали порт, например example.com:8080, в заголовке будет указан порт, а hdr_end завершится ошибкой проверьте "example.com".

hdr_sub выполнит сопоставление подстроки, что кажется более подходящим для вас (и для меня).

В любом решении есть неприятная вещь, которая мне не нравится. Заказать зависимую оценку результатов.

например (мои условия выглядят так на интерфейсе)

acl is_dbadmin hdr_sub(host) -i dbadmin.example.com

Запрос на порт 8080 будет таким:

Jul  9 02:48:40 localhost haproxy[8]: 192.168.1.1:55870 [09/Jul/2015:02:48:40.865] http-in example/s1 1/0/0/20/110 200 330722 - - ---- 0/0/0/0/0 0/0 {**example.com:8080**||http://example.com:} {Apache/2.4.10 (Debia||||} "GET /wp-includes/js/zxcvbn.min.js HTTP/1.1"

где, как порт 80, вероятно, может быть так

Jul  9 02:48:40 localhost haproxy[8]: 192.168.1.1:55870 [09/Jul/2015:02:48:40.865] http-in example/s1 1/0/0/20/110 200 330722 - - ---- 0/0/0/0/0 0/0 {example.com||***http://example.com***:} {Apache/2.4.10 (Debia||||} "GET /wp-includes/js/zxcvbn.min.js HTTP/1.1"

hdr_end это то, что вы ищете. Попробуй это:

acl valid_domains hdr_end(host) -i mysite.com 
redirect location http://mysite.com/invalid_domain if !valid_domains

Есть случаи, когда вам нужно четко указать на это, например, при обработке перенаправлений для SSL с подстановочными знаками с несколькими уровнями поддоменов.

Соответствующий конец (hdr_end или -m end) или подстрока (hdr_sub или -m sub) может иметь непреднамеренные побочные эффекты совпадения большего, чем вы ожидаете. Во многих случаях это может не иметь большого значения, поскольку у вас нет трафика для этих доменов, поступающего на сервер, но это не означает, что это технически правильное решение.

Я обнаружил, что использование регулярного выражения является лучшим способом явного сопоставления. Например, если вы хотите сопоставить только *.example.org без соответствия sub.domain.example.org:

acl valid_domains hdr(host) -m reg -i ^[^\.]+\.example\.org$

Если вы также хотите обрабатывать (любые) нестандартные порты, это можно немного расширить:

acl valid_domains hdr(host) -m reg -i ^[^\.]+\.example\.org(:[0-9]+)?$

Над будет соответствовать:

  • test1.example.org
  • test2.example.org:8080

и воля не соответствие:

  • example.org
  • two.subs.example.org
  • myexample.org
  • test.myexample.org
  • test.example.org.other.com