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

Tom*_*Tom 13 regex access-control-list 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
Run Code Online (Sandbox Code Playgroud)

我如何匹配任何子域?

我试过:

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
Run Code Online (Sandbox Code Playgroud)

在端口 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"
Run Code Online (Sandbox Code Playgroud)

端口 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"
Run Code Online (Sandbox Code Playgroud)


qua*_*nta 14

hdr_end就是你要找的。尝试这个:

acl valid_domains hdr_end(host) -i mysite.com 
redirect location http://mysite.com/invalid_domain if !valid_domains
Run Code Online (Sandbox Code Playgroud)

  • @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` (3认同)

gre*_*mac 12

在某些情况下,您需要对此进行明确说明,例如处理具有多级子域的通配符 SSL 的重定向。

匹配结束 ( hdr_endor -m end) 或子字符串 ( hdr_subor -m sub) 可能会产生超出预期的匹配的意外副作用。在许多情况下,这可能并不重要,因为这些域没有流量进入服务器,但这并不意味着它是技术上正确的解决方案。

使用正则表达式是我发现进行显式匹配的最佳方式。例如,如果您只想匹配*.example.org而不匹配sub.domain.example.org

acl valid_domains hdr(host) -m reg -i ^[^\.]+\.example\.org$
Run Code Online (Sandbox Code Playgroud)

如果您还想处理(任何)非标准端口,可以稍微扩展一下:

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

以上将匹配

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

并且匹配

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