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

Posted

技术标签:

【中文标题】.htaccess : 理解拒绝、允许和允许、拒绝的使用【英文标题】:.htaccess : understanding use of deny,allow and allow,deny 【发布时间】:2014-09-03 21:55:59 【问题描述】:

我试图通过一个简短的测试示例来了解 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。

据我所知,至少有一个组合,其中根 allow from all 在子文件夹 deny from all 上胜出,所以我不明白为什么我不能在这么简单的示例上成功执行此操作.

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

【问题讨论】:

【参考方案1】:

更新

自 Apache 2.4 as mentioned here 起,不推荐使用 deny, allow 指令。 所以现在允许所有访问的正确指令是

Require all granted

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

Require all granted
Require not ip 10.345.67.892

【讨论】:

【参考方案2】:

订单指令

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

请注意,所有 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 指令,则不会继承父目录的规则。请参阅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 指令。

结论

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

【讨论】:

嗯...是的,好的,这就是我几乎在任何地方都读过的内容。但是我的问题呢? :-) @Oliver 你的问题是什么组合可以让父母覆盖孩子?正如我所说并用我的例子证明的那样,显然没有。 告诉我,在您的第一个示例中,如果您在允许规则之前处理拒绝规则,据我所知,它不会创建白名单,而是拒绝所有人的访问。要创建白名单,您应该在拒绝之前订购允许。不是吗?第二个例子也一样,但方式相反。 您说添加拒绝,允许命令会重置父项的继承。你能给我指出一些关于这个的可靠文档吗?这也是我看到的,但我没有找到关于这个的消息...... 所以在你的第一个例子中,反转 order 指令相当于只写一个拒绝所有人,是吗?

以上是关于.htaccess : 理解拒绝、允许和允许、拒绝的使用的主要内容,如果未能解决你的问题,请参考以下文章

全部拒绝,通过 htaccess 只允许一个 IP

.htaccess 拒绝访问图像文件夹,但允许访问查看单个图像

text HTACCESS拒绝所有IP允许我的IP

.htaccess 拒绝所有-> 目录索引不起作用(拒绝所有和白名单文件)

拒绝使用 htaccess 直接访问文件

htaccess <Directory> 拒绝所有