12

我有一种情况,我试图拒绝访问我网站子目录中的所有文件。我已经在这个子目录中添加了一个 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>

这可以满足我的要求,但我觉得应该有一种方法可以让所有语句的否认本身起作用。有谁知道怎么做?

4

3 回答 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 解析所有规则并使用最后一个匹配规则,这与防火墙(使用第一个规则匹配命中)不同。首先读取全局规则,然后读取特定规则。

于 2013-07-12T09:47:18.827 回答
7

apache中的指令顺序真的不明显。

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

这是一段摘录:

合并顺序为:

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

所以会发生什么是您的<File>指令在 Directory之后处理(因为 .htaccess 实际上是当前目录的 Directory 指令)。

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

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

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

RedirectMatch 403 ^.*\.html$
于 2013-07-12T13:38:52.387 回答
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 文件,或不在 pages 文件夹中的 .PHP 文件。但是我无法访问根文件夹中的 index.php 文件,即使它在规则中。问题原来是因为我也将 /index.php 重写为 -> /home ,如下所示:

 RewriteRule ^home$ index.php [L]

解决方案是添加这个:

<Files home>
    allow from all
</Files>
于 2021-07-07T14:10:55.010 回答