HAProxy ACL多个OR条件

使用在Ubuntu 12.04上运行的Haproxy 1.5.12

我需要限制访问我的网站要求来自某些IP或在请求中有一个定义的参数。

因此,例如,以下请求应该只能从授权的IP工作:

http://www-test.example.com/page.php 

这个请求应该从任何知识产权(包括允许的知识产权)中完成:

 http://www-test.example.com/page.php?devtool=1 

我的ACL是:

 acl is_test hdr(host) -m sub test acl is_allowed src -f /etc/haproxy/allowed_ips acl is_devtool urlp(devtool) 1 acl is_devtool hdr_sub(Referer) devtool=1 

并且如果专门使用,它们工作得很好

 http-request deny if is_test ! is_allowed 

要么

 http-request deny if is_test ! is_devtool 

但是,如果我把它们与一个或者我无法从一个允许的IP访问URL(反转testing没有帮助):

 http-request deny if is_test ! is_allowed || is_test ! is_devtool 

任何想法如何做到这一点?

谢谢

你似乎想要施加的testing是这样的:

 A && !(B || C) 

…但这不是在逻辑上等同于你所写的,这本质上是…

 (A && !B) || (A && !C) 

A && !(B || C)的逻辑等价不用优先级括号实际上是这样的:

 A && !B && !C 

所以你要找的应该是这样的:

 http-request deny if is_test !is_allowed !is_devtool 

或者,重申一下:否认请求,如果 –

  • 它匹配is_test
  • 它不符合is_allowed
  • 它与is_devtool不匹配

只要这些条件中的任何一个是假的(不是testing,是允许的,是devtool),你的规则不匹配,并且不否认这个请求。