我试图通过一个简短的测试示例来理解order deny,allow
语句是如何React的。
我有以下网站结构进行测试:
/index.htm
/.htaccess(1)
/subfolder/index.htm
/subfolder/.htaccess(2)
.htaccess(1)
order deny,allow
allow from all
subfolder/.htaccess(2)
order deny,allow
deny from all
无论我在2中使用允许,拒绝/拒绝,允许(以及所有4种可能的组合)的顺序如何。htaccess文件,我从来不被允许访问子文件夹/索引。毫米
据我所知,至少有一个组合,其中根allow from all
在子文件夹deny from all
上获胜,所以我不明白为什么我不能在这么简单的例子中成功做到这一点。
你能解释一下原因和发生了什么吗?
2条答案
按热度按时间laawzig21#
订单指令
规则
order deny,allow
和order allow,deny
定义了deny from
和allow from
指令的处理顺序。所有允许和拒绝规则都将被处理,最终的相关规则将覆盖之前的任何规则。有关确认,请参见mod_authz_host模块文档的“订购指令”部分。请注意,所有的Allow和Deny指令都被处理,这与典型的防火墙不同,在防火墙中只使用第一个匹配项。最后一个匹配是有效的(也不同于典型的防火墙)。此外,行在配置文件中出现的顺序并不重要--所有“允许”行作为一个组处理,所有“拒绝”行作为另一个组处理,默认状态单独考虑。
例如,如果我们在允许规则之前处理拒绝规则,我们可以有效地创建允许IP地址的白名单。
相反,在下面的示例中,我们在拒绝规则之前处理允许规则,以获得被拒绝IP地址的黑名单。
继承
子目录将继承父目录的规则,除非它们声明自己的规则。如果子目录使用order指令或allow/deny指令,则不会继承父目录的规则。有关此行为的确认,请参见Bug 52406,它指的是本文档的“合并配置部分”一节。
对于没有实现任何合并逻辑的模块,例如mod_access_compat,后面部分的行为取决于后面部分是否有来自模块的任何指令。配置将被继承,直到进行更改,此时配置将被替换而不是合并。
简单测试
你也可以做这个简单的测试来确认这个行为。
将以下行放入父目录
.htaccess
中。以及子目录
.htaccess
中的以下任何或所有行。您将看到子目录现在可以公开访问,即使父目录包含
deny from all
,子目录没有allow from
指令。总结
根据文档和实验,似乎父目录不可能以任何方式覆盖子控制器的指令。
disho6za2#
更新
使用
deny, allow
指令从Apache 2开始就被弃用。4 as mentioned here。所以现在允许所有访问的正确指令是
并且能够撤销对给定IP的访问