I am running CentOS 5.5 with the stock Apache httpd-2.2.3.
I have enabled mod_status at the Location /server-status. I would like to allow access to this single Location in the following way:
- Deny from all
- Allow from the subnet 192.168.16.0/24
- Deny from a the IP 192.168.16.100, which is within the 192.168.16.0/24 subnet.
1 & 2 are easy. However, since I "Allow from 192.168.16.0/24", is it possible to Deny from 192.168.16.100?
I tried to add a Deny statement for 192.168.16.100 but it doesn't work. Here is the relevant config:
<Location /server-status>
SetHandler server-status
Order Allow,Deny
Deny from all
Deny from 192.168.16.100 # This does not deny access from 192.168.16.100
Allow from 192.168.16.0/24
</Location>
Or:
<Location /server-status>
SetHandler server-status
Order Allow,Deny
Deny from all
Deny from 192.168.16.100 # This does not deny access from 192.168.16.100
Allow from 192.168.16.0/24
</Location>
However, this doesn't prevent access to this particular page, as demonstrated in the Access logs:
www.example.org 192.168.16.100 - - [11/Mar/2011:16:01:14 -0800] "GET /server-status HTTP/1.1" 200 9966 "-" "
According to the manual for mod_authz_host:
Allow,Deny
First, all Allow directives are evaluated; at least one must match, or the request is rejected. Next, all Deny directives are evaluated. If any matches, the request is rejected
The IP address matches the Deny directive, so shouldn't the request be rejected?
According to the table on the mod_authz_host page, this IP address should "Match both Allow & Deny", and thus the "Final match controls: Denied" rule should apply.
Match Allow,Deny result Deny,Allow result Match Allow only Request allowed Request allowed Match Deny only Request denied Request denied No match Default to second directive: Denied Default to second directive: Allowed Match both Allow & Deny Final match controls: Denied Final match controls: Allowed