.htaccess:理解使用deny,允许和允许,拒绝

时间:2014-07-14 02:31:37

标签: apache .htaccess protection server-configuration

我试图通过一个简短的测试示例来理解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上获胜,所以我不明白为什么我不能成功这样做那么简单的例子。

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

2 个答案:

答案 0 :(得分:5)

订单指令

规则order deny,alloworder allow,deny定义处理deny fromallow 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