如何匹配HAproxy的ACL列表中的通配符主机?


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

...但是都没有奏效。

谢谢

Answers:


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结尾。因此,这场比赛还不够具体,对吧?
萨博

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.