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

10

У меня есть следующие строки в моем 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

... но ни сработало.

Спасибо

Том
источник

Ответы:

15

Я чувствую, что 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"
Ридж Уилсон
источник
12

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

acl valid_domains hdr_end(host) -i mysite.com 
redirect location http://mysite.com/invalid_domain if !valid_domains
кванты
источник
Что делать, если у вас есть два домена. Один называется mysite.com, а другой - notmysite.com? Оба заканчиваются на mysite.com. Так что совпадение не достаточно конкретное, верно?
Saab
1
@Saab в этом случае я бы написал acl valid_domains hdr(host) -i mysite.com+ acl valid_domains hdr_end(host) -i .mysite.comили просто использовалacl valid_domains hdr_dom(host) -i mysite.com
howanghk
7

В некоторых случаях вам необходимо четко указать это, например, обрабатывать перенаправления для подстановочного 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
gregmac
источник