.htaccess:理解deny,allow和allow,deny的用法

pw136qt2  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(148)

我试图通过一个简短的测试示例来理解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上获胜,所以我不明白为什么我不能在这么简单的例子中成功做到这一点。
你能解释一下原因和发生了什么吗?

laawzig2

laawzig21#

订单指令

规则order deny,alloworder allow,deny定义了deny fromallow from指令的处理顺序。所有允许和拒绝规则都将被处理,最终的相关规则将覆盖之前的任何规则。有关确认,请参见mod_authz_host模块文档的“订购指令”部分。
请注意,所有的Allow和Deny指令都被处理,这与典型的防火墙不同,在防火墙中只使用第一个匹配项。最后一个匹配是有效的(也不同于典型的防火墙)。此外,行在配置文件中出现的顺序并不重要--所有“允许”行作为一个组处理,所有“拒绝”行作为另一个组处理,默认状态单独考虑。
例如,如果我们在允许规则之前处理拒绝规则,我们可以有效地创建允许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,它指的是本文档的“合并配置部分”一节。
对于没有实现任何合并逻辑的模块,例如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指令。

总结

根据文档和实验,似乎父目录不可能以任何方式覆盖子控制器的指令。

disho6za

disho6za2#

更新

使用deny, allow指令从Apache 2开始就被弃用。4 as mentioned here
所以现在允许所有访问的正确指令是

Require all granted

并且能够撤销对给定IP的访问

Require all granted
Require not ip 10.345.67.892

相关问题