7.2. Using ACLs to form conditions
- Some actions are only performed upon a valid condition. A condition is a
- combination of ACLs with operators. 3 operators are supported :
-
- - AND (implicit)
- - OR (explicit with the "or" keyword or the "||" operator)
- - Negation with the exclamation mark ("!")
-
- A condition is formed as a disjunctive form:
-
- [!]acl1 [!]acl2 ... [!]acln { or [!]acl1 [!]acl2 ... [!]acln } ...
-
- Such conditions are generally used after an "if" or "unless" statement,
- indicating when the condition will trigger the action.
-
- For instance, to block HTTP requests to the "*" URL with methods other than
- "OPTIONS", as well as POST requests without content-length, and GET or HEAD
- requests with a content-length greater than 0, and finally every request which
- is not either GET/HEAD/POST/OPTIONS !
-
- acl missing_cl hdr_cnt(Content-length) eq 0
- http-request deny if HTTP_URL_STAR !METH_OPTIONS || METH_POST missing_cl
- http-request deny if METH_GET HTTP_CONTENT
- http-request deny unless METH_GET or METH_POST or METH_OPTIONS
-
- To select a different backend for requests to static contents on the "www" site
- and to every request on the "img", "video", "download" and "ftp" hosts :
-
- acl url_static path_beg /static /images /img /css
- acl url_static path_end .gif .png .jpg .css .js
- acl host_www hdr_beg(host) -i www
- acl host_static hdr_beg(host) -i img. video. download. ftp.
-
- # now use backend "static" for all static-only hosts, and for static URLs
- # of host "www". Use backend "www" for the rest.
- use_backend static if host_static or host_www url_static
- use_backend www if host_www
-
- It is also possible to form rules using "anonymous ACLs". Those are unnamed ACL
- expressions that are built on the fly without needing to be declared. They must
- be enclosed between braces, with a space before and after each brace (because
- the braces must be seen as independent words). Example :
-
- The following rule :
-
- acl missing_cl hdr_cnt(Content-length) eq 0
- http-request deny if METH_POST missing_cl
-
- Can also be written that way :
-
- http-request deny if METH_POST { hdr_cnt(Content-length) eq 0 }
-
- It is generally not recommended to use this construct because it's a lot easier
- to leave errors in the configuration when written that way. However, for very
- simple rules matching only one source IP address for instance, it can make more
- sense to use them than to declare ACLs with random names. Another example of
- good use is the following :
-
- With named ACLs :
-
- acl site_dead nbsrv(dynamic) lt 2
- acl site_dead nbsrv(static) lt 2
- monitor fail if site_dead
-
- With anonymous ACLs :
-
- monitor fail if { nbsrv(dynamic) lt 2 } || { nbsrv(static) lt 2 }
-
- See section 4.2 for detailed help on the "http-request deny" and "use_backend"
- keywords.