我的 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
...但都没有用。
谢谢
答案1
我觉得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"
答案2
在某些情况下您需要明确这一点,例如处理具有多层子域的通配符 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
答案3
hdr_end
就是你要找的。试试这个:
acl valid_domains hdr_end(host) -i mysite.com
redirect location http://mysite.com/invalid_domain if !valid_domains
答案4
我提供另一个解决方案
acl valid_domains hdr_dom(host) -i mysite.com
acl valid_domains hdr_dom(host) -i -m end .mysite.com
一个 acl 中的规则通过或组合而成。第一个仅接受顶级域,第二个将接受子域。由于hdr_dom
我知道这是一个老问题,但我还是来这里看看。参见文档了解详细信息。