Apache 拒绝子目录htaccess中的所有内容不覆盖根htaccess中的文件规则

Apache 拒绝子目录htaccess中的所有内容不覆盖根htaccess中的文件规则,apache,.htaccess,Apache,.htaccess,我遇到了一种情况,我试图拒绝访问我网站子目录中的所有文件。我已将一个htaccess文件添加到此子目录,并向其添加了一个deny from all指令。然而,我在站点根目录中也有一个htaccess文件,它允许特定的文件类型,并且看起来这些文件类型在子目录中仍然是可访问的,尽管我不再需要它们。我有一个解决办法(见下文),但我觉得一定有更好的办法。以下是我的两个htaccess文件: Root.htaccess # Deny access to everything by default Orde

我遇到了一种情况,我试图拒绝访问我网站子目录中的所有文件。我已将一个htaccess文件添加到此子目录,并向其添加了一个deny from all指令。然而,我在站点根目录中也有一个htaccess文件,它允许特定的文件类型,并且看起来这些文件类型在子目录中仍然是可访问的,尽管我不再需要它们。我有一个解决办法(见下文),但我觉得一定有更好的办法。以下是我的两个htaccess文件:

Root.htaccess

# Deny access to everything by default
Order Deny,Allow
deny from all

# Allow access to html files
<Files *.html>
    allow from all
</Files>
# Deny access to everything
deny from all
# Deny access to everything
Order Allow,Deny
deny from all
<Files *.*>
    deny from all
</Files>
解决方法:

htaccess子目录

# Deny access to everything by default
Order Deny,Allow
deny from all

# Allow access to html files
<Files *.html>
    allow from all
</Files>
# Deny access to everything
deny from all
# Deny access to everything
Order Allow,Deny
deny from all
<Files *.*>
    deny from all
</Files>
#拒绝访问所有内容
命令允许,拒绝
全盘否定
全盘否定

这正是我想要的,但我觉得应该有一种方法可以让“拒绝来自所有”语句本身起作用。有人知道怎么做吗?

您可以像这样使用Root.htaccess

# Deny access to everything by default
Order Deny,Allow
deny from all

# Allow access to html files
<Files *.html>
    allow from all
</Files>

# Deny access to sub directory
<Files subdirectory/*>
    deny from all
</Files>
#默认情况下拒绝访问所有内容
命令拒绝,允许
全盘否定
#允许访问html文件
通融
#拒绝访问子目录
全盘否定
子目录中不需要单独的.htaccess


在第一种情况下,您允许访问根目录中.htaccess中的所有html文件,而不拒绝子目录中的任何位置。Apache解析所有规则并使用最后一个匹配规则,这与防火墙不同(防火墙使用第一个规则匹配命中)。首先读取全局规则,然后读取特定规则。

apache中指令的顺序并不明显

您在文档中有完整的描述

以下是摘录:

合并的顺序是:

  • (正则表达式除外)和.htaccess同时完成(如果允许,.htaccess将覆盖
  • (和
  • 同时完成
  • 同时完成
因此,您的
指令是在目录指令之后处理的(作为.htaccess实际上是当前目录的目录指令)

它适用于给定的示例,因为这些文件指令实际上嵌套在.htaccess目录指令中,第二个文件指令应用于父目录指令之后

不能在父目录中使用
指令,子目录中的文件将被排除在外,因为fileMatch只处理文件名,而不处理文件路径。但是你可以尝试一个定位匹配,但它可能会以一个非常复杂的方式结束,以禁止用点进行定位黑客攻击

事实上,我在这里使用的解决方案是父文件夹中的重定向匹配:

RedirectMatch 403 ^.*\.html$

啊,谢谢。我现在明白我错在哪里了。我错误地认为根htaccess中的所有规则都会被计算,然后子目录htaccess中的所有规则都会被计算。我没有意识到事实上两个文件中有一个组件的合并,其结果在一次传递中应用。谢谢你的回答!我看了一下你提供的链接,连同你的答案,我相信我现在理解了这个问题。但是,我不确定您提供的RedirectMatch将如何拒绝访问该特定子文件夹中的所有文件…实际表单将阻止访问所有html文件。我很久以前就写过,但我认为正确的公式更像是:在所有子目录中,但类似于
redirectmatch403^.subdirectory/*\.html$