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

Индексы 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>

Но это дает мне ошибку «У вас нет разрешения на доступ», когда я просматриваю папку.

Вы можете использовать mod_rewrite. Попробуйте следующее:

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

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

Это предотвращает доступ (403 Запрещено), если не запрашивается .txt файл или пустой каталог (требуется для получения списка каталогов). В 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 шаблон немного, так как нам не нужно явно проверять базовый каталог.