Apache 索引限制下载文件类型

Apache 索引限制下载文件类型

有人能指导我如何从目录列表中限制 Apache 中可下载的文件类型吗?

我在 httpd.conf 中有一些目录定义,如下所示:

<Directory "/var/www/data01">
    Options Indexes FollowSymLinks
    Require all granted
    AllowOverride none
</Directory>

我想让用户做的是列出每个文件夹中的所有文件,但只下载具有特定扩展名的文件(例如 *.txt)

我尝试过这个:

<Directory "/var/www/data01">
    Options Indexes FollowSymLinks
    IndexOptions ShowForbidden
    Require all granted
    AllowOverride all
    order allow,deny
    <FilesMatch "\.txt$">
        order deny,allow
        allow from all
    </FilesMatch> 
</Directory>

但是当我浏览文件夹时,会出现“您无权访问”的错误。

答案1

您可以使用 mod_rewrite。尝试以下操作:

<Directory "/var/www/data01">
    Options Indexes FollowSymLinks
    IndexOptions ShowForbidden
    Require all granted
    AllowOverride all

    RewriteEngine On
    RewriteRule !(\.txt$|^$) - [NS,F]
</Directory>

.txt如果不请求文件或裸目录(获取目录列表所需),这将阻止访问(403 Forbidden) 。 NS( nosubreq) 标志是跳过内部子请求所必需的。生成目录列表时,似乎会为目录中的每个文件触发内部子请求。因此,如果没有该标志NS,目录列表最终将被阻止。

Require all granted
order allow,deny

您实际上不应该混合使用Require(Apache 2.4+) 和Order allow,deny(Apache 2.2)。Apache 2.2 指令仅用于向后兼容。您应该Require在 Apache 2.4+ 上使用。顺便说一句,这两个指令的作用相反……第一个允许访问,然后第二个否认最终结果是访问被拒绝(但这不是因为这些指令的顺序,而是因为“拒绝”访问获胜)。

更新:为了使其在子目录上也能工作,请将 RewriteRule指令更改为:

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule !\.txt$ - [NS,F]

(条件)指令RewriteCond确保以下指令仅适用于实际文件(忽略目录)。这使我们能够RewriteRule稍微简化模式,因为我们不需要明确检查基目录。

相关内容