繁体   English   中英

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

[英].htaccess : understanding use of deny,allow and allow,deny

我试图通过一个简短的测试示例来了解order deny,allow语句如何对我目前阅读的内容做出反应。

我有以下用于测试的站点结构:

/index.htm
/.htaccess (1)
/子文件夹/index.htm
/子文件夹/.htaccess (2)

.htaccess (1)

order deny,allow  
allow from all

子文件夹/.htaccess (2)

order deny,allow  
deny from all

无论我在 2 个 .htaccess 文件中使用的允许、拒绝/拒绝、允许(以及所有 4 种可能的组合)的顺序如何,我都不允许访问子文件夹/index.htm。

据我所知,至少有一种组合,其中 root allow from all wins on allow from all wins deny from all ,所以我不明白为什么我不能在这个简单的例子上成功做到这一点。

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

订单指令

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

请注意,所有 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放在父目录.htaccess

order deny,allow  
deny from all

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

order deny,allow  
deny from 0.0.0.0

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


结论

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

更新

使用deny, allow指令因为Apache 2.4已被弃用这里提到
所以现在允许所有访问的正确指令是

Require all granted

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

Require all granted
Require not ip 10.345.67.892

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM