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

问题描述 投票:0回答:3

我遇到了一种情况,我试图拒绝访问我的网站子目录中的所有文件。我已向该子目录添加了一个 htaccess 文件,并向其添加了拒绝所有指令。但是,我在站点根目录中还有一个 htaccess 文件,它允许特定的文件类型,并且似乎这些文件类型仍然可以在子目录中访问,即使我不再希望它们如此。我有一个解决方法(见下文),但我觉得必须有更好的方法。这是我的两个 htaccess 文件:

根.htaccess

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

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

子目录.htaccess

# Deny access to everything
deny from all

解决方法:

子目录.htaccess

# Deny access to everything
Order Allow,Deny
deny from all
<Files *.*>
    deny from all
</Files>

这符合我的要求,但我觉得应该有一种方法可以让所有声明的拒绝本身发挥作用。有谁知道怎么办吗

apache .htaccess
3个回答
17
投票

你可以像这样拥有你的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>

子目录中不需要单独的.htaccess。

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


7
投票

apache 中的指令顺序确实不明显。

您在文档中对其有完整的描述“如何合并各部分”

以下是摘录:

合并顺序为:

  • <Directory>
    (正则表达式除外)和 .htaccess 同时完成(使用 .htaccess,如果允许,覆盖
    <Directory>
  • <DirectoryMatch>
    (和
    <Directory ~>
  • <Files>
    <FilesMatch>
    同时完成
  • <Location>
    <LocationMatch>
    同时完成
  • <If>

所以发生的情况是,您的

<File>
指令在 Directory 指令之后被处理(因为 .htaccess 实际上是当前目录的 Directory 指令)。

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

您不能在父目录中使用

<FileMatch>

 指令,子目录中的文件将被排除,因为 fileMatch 仅适用于文件名,而不适用于文件路径。但是您也许可以尝试使用 LocationMatch,但它可能会以相当复杂的方式结束,以禁止使用点进行位置黑客攻击。

事实上,我在这里使用的解决方案是父文件夹中的 RedirectMatch:

RedirectMatch 403 ^.*\.html$
    

0
投票
找到这个线程后,我有一段时间无法让它工作,然后我找到了原因,因此我的答案是(希望)帮助将来遇到同样问题的人。

我复制了

@bansi的答案,像这样:

#Deny access to everything by default. Order Deny,Allow deny from all # Allow access to the root index.php. <Files index.php> allow from all </Files> #allow access to the other .PHP files <Files pages/*.php> allow from all </Files>
它确实部分工作,我无法访问 js 文件夹中的任何 javascript 文件,或不在页面文件夹中的 .PHP 文件。
但我无法访问根文件夹中的 index.php 文件,即使它在规则中。问题原来是因为我也将 /index.php 重写为 -> /home ,如下所示:

RewriteRule ^home$ index.php [L]
解决方案是添加以下内容:

<Files home> allow from all </Files>
    
© www.soinside.com 2019 - 2024. All rights reserved.