Apache2:允许目录索引,但限制按类型访问文件

Apache2:允许目录索引,但限制按类型访问文件

我需要配置我的 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.htmlindex.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>

相关内容