代码之家  ›  专栏  ›  技术社区  ›  Oliver

.htaccess:理解deny、allow和allow、deny的用法

  •  3
  • Oliver  · 技术社区  · 10 年前

    我试图通过一个简短的测试示例来理解 order deny,allow 声明对我目前所读的内容做出反应。

    我有以下测试场地结构:

    /索引.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文件中使用allow、deny/deny、allow(以及所有4种可能的组合)的顺序,我都不能访问子文件夹/index.htm。

    据我所知,至少有一种组合 allow from all 在子文件夹中获胜 deny from all ,所以我不明白为什么我不能在这么简单的例子上成功做到这一点。

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

    2 回复  |  直到 10 年前
        1
  •  6
  •   Alexander O'Mara    10 年前

    订单指令

    规则 order deny,allow order allow,deny 定义 deny from allow from 处理指令。处理所有允许和拒绝规则,最终相关规则将覆盖以前的任何规则。请参见 Order Directive mod_authz_host模块文档的一节进行确认。

    请注意,所有允许和拒绝指令都会被处理,与 典型的防火墙,其中只使用第一个匹配。最后一场比赛 是有效的(也不同于典型的防火墙)。此外,订单 配置文件中出现的行不重要-- 所有允许行作为一个组处理,所有拒绝行作为 并且默认状态被自己考虑。

    例如,如果我们在允许规则之前处理拒绝规则,我们可以有效地创建允许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 并且子目录没有 允许来自 指令。


    结论

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

        2
  •  3
  •   JoDev    4 年前

    更新

    使用 deny, allow 自Apache 2.4以来,已弃用指令 as mentioned here .
    所以现在允许所有访问的正确指令是

    Require all granted
    

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

    Require all granted
    Require not ip 10.345.67.892