我需要配置我的 Apache2 服务器(版本 2.2.22),以便允许自动索引 WWW 根文件夹及其子目录,但限制访问(即限制下载)仅限于一组特定文件类型(即 .txt 和 .log)。换句话说,任何人都可以看到存在哪些文件,但只能下载某些文件类型。
我想出了下面的方法,它确实将下载限制为仅指定的文件类型,但目录索引的所有 URL 都会返回 403 Forbidden。
<Directory /var/www/>
Options Indexes FollowSymLinks
SetOutputFilter DEFLATE
AllowOverride None
Order allow,deny
<FilesMatch "">
Order deny,allow
allow from all
</FilesMatch>
<FilesMatch ".+\.(?!(txt|log)$)[^\.]+?$">
Order allow,deny
deny from all
</FilesMatch>
</Directory>
答案1
您还需要允许索引文件:
<FilesMatch "^index\.">
Order allow,deny
allow from all
</FilesMatch>
因为 Apache 会搜索它们(如index.html
、index.cgi
、...),但它们都被禁止了。我不确定为什么,但我认为 Apache 甚至无法检查这些文件是否存在,然后发送 403。如果 Apache 可以检查这些索引文件是否存在,它将创建目录索引,而这需要指令<FilesMatch "">
,因为索引文件名是“”。
您可以在错误日志文件中找到信息,例如以下几行:
client denied by server configuration: /var/www/index.html
而且因为您希望也列出禁止的文件,所以您需要添加:
IndexOptions ShowForbidden
例如之后Options Indexes FollowSymLinks
。有很多目录索引选项,您可以在阿帕奇文档。
希望这可以帮助。
答案2
需要从指令和空字符串FilesMatch
中命中所有可能的条目。如果你有这个:DirectoryIndex
DirectoryIndex index.html index.html.var index.php
那么这是你的比赛:
<Files ~ ^index\.(html|php|html.var)$|^$>
最简单的设置DirectoryIndex
然后匹配可能是:
DirectoryIndex index.html
<Files ~ ^index\.html$|^$>
<Limit GET HEAD>
Order Allow,Deny
Allow from all
</Limit>
</Files>