我试图通过一个简短的测试示例来理解该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种可能的组合)使用的顺序,我都永远不允许访问subfolder / index.htm。
据我所知,至少有一种组合可以使根allow from all
在子文件夹上获胜deny from all
,所以我不明白为什么我无法在如此简单的示例中成功做到这一点。
您能解释为什么以及发生了什么吗?
规则order deny,allow
和order allow,deny
定义按顺序处理deny from
和allow 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
指令。
根据文档和实验,似乎父目录不可能以任何方式覆盖子级导演的指令。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句