Apache Order规则(Allow deny)学习
在 Apache HTTP Server 中,Order 指令通常与 Allow 和 Deny 指令一起使用,用于控制访问权限。
这组指令可以用来定义哪些客户端或 IP 地址被允许访问资源,哪些被拒绝。
Order 指令决定了如何处理多个 Allow 和 Deny 指令的规则,以确定最后的访问结果。
Order 指令有两个值可选:allow,deny 和 deny,allow,它们决定了 Allow 和 Deny 指令的处理顺序。
两种规则的逻辑
Order allow,deny
:在这种情况下,Allow
指令会首先生效,然后Deny
指令。顺序如下:所有客户端默认允许访问。
如果有
Deny
规则匹配,那么访问被拒绝,不论之前是否有匹配的Allow
规则。如果没有
Deny
规则匹配,然后再检查Allow
规则。只有匹配Allow
规则的客户端才被允许访问。如果没有匹配的
Allow
或Deny
规则,那么访问也会被允许。Order deny,allow
:在这种情况下,Deny
指令会首先生效,然后Allow
指令。顺序如下:所有客户端默认被拒绝访问。
如果有
Allow
规则匹配,那么访问被允许,不论之前是否有匹配的Deny
规则。如果没有
Allow
规则匹配,然后再检查Deny
规则。只有匹配Deny
规则的客户端才被拒绝访问。如果没有匹配的
Allow
或Deny
规则,那么访问也会被拒绝。
例子
<Directory "/var/www/public"> Order allow,deny Allow from all Deny from 192.168.1.100 </Directory>
由于allow在前,先执行allow from all,再执行deny from 192.168.1.100
即允许192.168.1.100以外的所有地址访问/var/www/public
<Directory "/var/www/private"> Order deny,allow Deny from all Allow from 192.168.1.100 </Directory>
先拒绝所有流量,再允许192.168.1.100的流量,即只允许192.168.1.100的流量访问
<Directory "/var/www/internal"> Order deny,allow Deny from all Allow from 127.0.0.1 Allow from 192.168.1 </Directory>
先拒绝所有流量,再允许127.0.0.1与192.168.1开头的流量,即只允许127.0.0.1与192.168.1开头的访问
<Directory "/var/www/images"> Order allow,deny <FilesMatch "\.(jpg|png|gif)$"> Allow from all </FilesMatch> Order deny,allow Deny from all </Directory>
允许所有IP地址访问 /images
目录中的图片文件,但拒绝所有其他文件的访问
一个Directory块中多个order
如果在Apache配置中有两个`Order`指令,它们定义了两组不同的访问控制规则,
一个使用"allow,deny"顺序,另一个使用"deny,allow"顺序。
这两个`Order`指令分别影响在同一个`<Directory>`块或类似的配置块内的访问控制规则的执行顺序。
<Directory "/var/www/example"> Order allow,deny Allow from all Order deny,allow Deny from 192.168.1.100 </Directory>
在这个例子中,`Order allow,deny`指令将首先应用,它允许所有IP地址访问`/var/www/example`目录。
然后,`Order deny,allow`指令将应用,它将拒绝特定IP地址(192.168.1.100)的访问。
因为这两个指令使用了不同的顺序,所以它们的执行顺序是有影响的。
实际执行顺序如下:
1. 首先,`Order allow,deny`允许所有IP地址访问目录。
2. 然后,`Order deny,allow`拒绝特定IP地址(192.168.1.100)的访问。
但由于先前的"允许"规则已经生效,这个"拒绝"规则不会影响其他IP地址。
这就是两个`Order`指令的关系,它们会按照它们在配置中的顺序依次应用,
而不是相互冲突。这允许更复杂的访问控制规则的定制。
多个order下的默认规则
在Apache中,如果一个请求在多个`Order`规则中都没有匹配到规则(既不允许也不拒绝),
那么最后一个出现的`Order`规则将起作用。
Apache按照它们在配置文件中的出现顺序逐个处理`Order`规则,
如果一个请求在所有`Order`规则中都没有匹配到规则,则最后一个规则决定请求的处理方式。
例如,如果你有以下配置:
<Directory "/var/www/example"> Order allow,deny Allow from 192.168.0 Order deny,allow Deny from 192.168.1.100 </Directory>
在这个配置中,如果一个请求来自一个既不匹配`Allow from 192.168.0`也不匹配`Deny from 192.168.1.100`的IP地址,
那么请求将按照最后一个出现的`Order`规则(`Order deny,allow`)的规则来处理。
因此,请求将被拒绝,因为`Order deny,allow`规则指示"先拒绝,后允许"。