В моем 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