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

Oli*_*ver 2 apache .htaccess server-configuration protection

我试图通过一个简短的测试例子来理解这些order deny,allow语句如何反应我看到的东西,直到现在.

我有以下网站结构进行测试:

将/index.htm
/.htaccess(1)
/subfolder/index.htm
/subfolder/.htaccess(2)

.htaccess(1)

order deny,allow  
allow from all
Run Code Online (Sandbox Code Playgroud)

子文件夹/ .htaccess(2)

order deny,allow  
deny from all
Run Code Online (Sandbox Code Playgroud)

无论我在2 .htaccess文件中使用allow,deny/deny,allow(以及所有4种可能的组合)的顺序,我都不会被允许访问子文件夹/ index.htm.

根据我的理解,至少有一个组合,其中根allow from all在子文件夹上获胜deny from all,所以我不明白为什么我不能在这个如此简单的例子上做到这一点.

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

Ale*_*ara 5

订单指令

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

请注意,处理所有Allow和Deny指令,与典型防火墙不同,后者仅使用第一个匹配.最后一次匹配是有效的(也与典型的防火墙不同).此外,行在配置文件中出现的顺序并不重要 - 所有允许行都作为一个组处理,所有拒绝行都被视为另一个,并且默认状态由其自身考虑.

例如,如果我们在允许规则之前处理拒绝规则,我们可以有效地创建允许的IP地址的白名单.

order deny,allow
deny from all
allow from 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

相反,在以下示例中,我们在拒绝规则之前处理允许规则,用于拒绝IP地址的黑名单.

order allow,deny
allow from all
deny from 127.0.0.1
Run Code Online (Sandbox Code Playgroud)


遗产

子目录将继承父目录的规则,除非它们声明自己的规则.如果子目录使用order指令或allow/deny指令,则不会继承父级的规则.有关此行为的确认,请参阅本文档的" 合并配置节"部分的错误52406.

对于未实现任何合并逻辑的模块,例如mod_access_compat,后面部分中的行为取决于后一部分是否具有来自模块的任何指令.继承配置,直到进行更改,此时配置被替换而不是合并.

简单测试

您也可以执行此简单测试以确认此行为.

将以下行放在父目录中.htaccess.

order deny,allow  
deny from all
Run Code Online (Sandbox Code Playgroud)

以及子目录中的以下任何或所有行.htaccess.

order deny,allow  
deny from 0.0.0.0
Run Code Online (Sandbox Code Playgroud)

您将看到子目录现在可公开访问,即使父目录包含deny from all且子目录没有allow from指令.


结论

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