Назад | Перейти на главную страницу

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>

Вам также необходимо разрешить индексные файлы:

<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. Есть множество вариантов для индексов каталогов, вы можете найти их в документ apache.

Надеюсь это поможет.

В 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>