Você pode usar o mod_rewrite. Tente o seguinte:
<Directory "/var/www/data01">
Options Indexes FollowSymLinks
IndexOptions ShowForbidden
Require all granted
AllowOverride all
RewriteEngine On
RewriteRule !(\.txt$|^$) - [NS,F]
</Directory>
Isso impede o acesso (403 Proibido) se não solicitar um arquivo .txt
ou o diretório nulo (necessário para obter a listagem do diretório). O sinalizador NS
( nosubreq
) é necessário para ignorar sub-solicitações internas. Quando a listagem de diretórios é gerada, uma sub-requisição interna parece ser acionada para cada arquivo no diretório. Portanto, sem o sinalizador NS
, a listagem do diretório é bloqueada.
Require all granted order allow,deny
Você não deve realmente misturar Require
(Apache 2.4+) e Order allow,deny
(Apache 2.2). As diretivas do Apache 2.2 estão disponíveis apenas para compatibilidade com versões anteriores. Você deve estar usando Require
no Apache 2.4+. Aliás, essas duas diretivas fazem o contrário ... a primeira permite acesso, então a segunda a nega . O resultado líquido é que o acesso é negado (mas isso não é devido à ordem dessas diretivas, mas porque o acesso "negando" ganha).
UPDATE: Para que isso funcione também em subdiretórios, altere a diretiva RewriteRule
para:
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule !\.txt$ - [NS,F]
A diretiva RewriteCond
(condition) garante que a diretiva a seguir se aplique apenas aos arquivos reais (ignorando diretórios). Isso nos permite simplificar um pouco o padrão RewriteRule
, já que não precisamos verificar explicitamente o diretório base.