有人能指导我如何从目录列表中限制 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
稍微简化模式,因为我们不需要明确检查基目录。