我试图通过一个简短的测试示例来理解order deny,allow
语句如何对我所读到的内容做出反应,直到现在为止。
我有以下用于测试的网站结构:
将/index.htm
/.htaccess(1)
/subfolder/index.htm
/subfolder/.htaccess(2)
.htaccess(1)
order deny,allow
allow from all
子文件夹/ .htaccess(2)
order deny,allow
deny from all
无论我在2 .htaccess文件中使用allow,deny / deny,allow(以及所有4种可能的组合)的顺序,我都不会被允许访问子文件夹/ index.htm。
据我所知,至少有一个组合,根allow from all
在子文件夹deny from all
上获胜,所以我不明白为什么我不能成功这样做那么简单的例子。
你能解释一下为什么以及发生了什么吗?
答案 0 :(得分:5)
规则order deny,allow
和order allow,deny
定义处理deny from
和allow from
指令的顺序。处理所有允许和拒绝规则,最终相关规则覆盖任何先前的规则。请参阅mod_authz_host模块文档的Order Directive部分以进行确认。
请注意,处理所有Allow和Deny指令,与a不同 典型的防火墙,只使用第一个匹配。最后一场比赛 是有效的(也不像典型的防火墙)。另外,订单 其中的行出现在配置文件中并不重要 - all允许行作为一个组处理,所有拒绝行都是 被视为另一个,默认状态是自己考虑的。
例如,如果我们在允许规则之前处理拒绝规则,我们可以有效地创建允许IP地址的白名单。
order deny,allow
deny from all
allow from 127.0.0.1
相反,在以下示例中,我们在拒绝规则之前处理允许规则,以获取拒绝IP地址的黑名单。
order allow,deny
allow from all
deny from 127.0.0.1
子目录将继承父目录的规则,除非它们声明自己的规则。如果子目录使用order指令或allow / deny指令,则不会继承父级的规则。有关此行为的确认,请参阅本文档Bug 52406部分的Merging of configuration sections。
对于不实现任何合并逻辑的模块,例如 mod_access_compat,后面部分的行为取决于是否 后面的部分有来自该模块的任何指令。该 配置是继承的,直到进行更改,此时 配置被替换而不是合并。
您也可以执行此简单测试以确认此行为。
将以下行放在父目录.htaccess
中。
order deny,allow
deny from all
子目录.htaccess
中的以下任何或所有行。
order deny,allow
deny from 0.0.0.0
您将看到子目录现在可公开访问,即使父目录包含deny from all
且子目录没有allow from
指令。
根据文档和实验,似乎父目录不可能以任何方式覆盖子导演的指令。
答案 1 :(得分:2)
自Apache 2.4 as mentioned here开始不推荐使用deny, allow
指令。
所以现在将是允许所有访问的正确指令
Require all granted
并能够撤消对给定IP的访问
Require all granted
Require not ip 10.345.67.892