我遇到了一种情况,我试图拒绝访问我的网站子目录中的所有文件。我已向该子目录添加了一个 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>
这符合我的要求,但我觉得应该有一种方法可以让所有声明的拒绝本身发挥作用。有谁知道怎么办吗
你可以像这样拥有你的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 会解析所有规则并使用最后一个匹配规则,这与防火墙(使用第一个规则匹配命中)不同。首先阅读全局规则,然后阅读具体规则。
apache 中的指令顺序确实不明显。
您在文档中对其有完整的描述“如何合并各部分”。
以下是摘录:
合并顺序为:
(正则表达式除外)和 .htaccess 同时完成(使用 .htaccess,如果允许,覆盖<Directory>
)<Directory>
(和<DirectoryMatch>
)<Directory ~>
和<Files>
同时完成<FilesMatch>
和<Location>
同时完成<LocationMatch>
<If>
所以发生的情况是,您的
<File>
指令在 Directory 指令之后被处理(因为 .htaccess 实际上是当前目录的 Directory 指令)。
它适用于您给定的示例,因为这些文件指令实际上嵌套在 .htaccess 目录指令中,并且第二个文件指令在父目录指令之后应用。您不能在父目录中使用
<FileMatch>
指令,子目录中的文件将被排除,因为 fileMatch 仅适用于文件名,而不适用于文件路径。但是您也许可以尝试使用 LocationMatch,但它可能会以相当复杂的方式结束,以禁止使用点进行位置黑客攻击。事实上,我在这里使用的解决方案是父文件夹中的 RedirectMatch:
RedirectMatch 403 ^.*\.html$
我复制了
@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>