3

我试图通过一个简短的测试示例来了解这些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 文件中使用允许、拒绝/拒绝、允许(以及所有 4 种可能的组合)的顺序,都不允许我访问子文件夹/index.htm。

据我了解,至少有一种组合可以让 rootallow from all在 subfolder 上获胜deny from all,所以我不明白为什么我不能在这个简单的例子中成功地做到这一点。

你能解释一下为什么和发生了什么吗?

4

2 回答 2

6

订单指令

规则order deny,allow并定义处理和指令的order allow,deny顺序。处理所有允许和拒绝规则,最终的相关规则将覆盖任何先前的规则。请参阅 mod_authz_host 模块文档的订单指令部分进行确认。deny fromallow from

请注意,所有 Allow 和 Deny 指令都会被处理,这与典型的防火墙不同,后者只使用第一个匹配项。最后一个匹配是有效的(也不同于典型的防火墙)。此外,行在配置文件中出现的顺序并不重要——所有 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 指令,则不会继承父目录的规则。有关此行为的确认,请参阅参考本文档的配置部分合并部分的错误 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指令。


结论

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

于 2014-07-14T02:38:53.483 回答
3

更新

如此处所述,自 Apache 2.4 以来不推荐使用deny, allow指令。 所以现在允许所有访问的正确指令是

Require all granted

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

Require all granted
Require not ip 10.345.67.892
于 2020-10-14T15:07:16.517 回答