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