Índices Apache restringem os tipos de arquivo de download

3

Alguém pode me orientar sobre como posso limitar os tipos de arquivo que podem ser baixados no Apache de uma listagem de diretório?

Eu tenho algumas definições de diretório no httpd.conf, como o seguinte:

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

O que eu quero que o usuário faça é listar TODOS os arquivos em todas as pastas, mas só baixar arquivos com extensões específicas (por exemplo, * .txt)

Eu tentei isso:

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

Mas isso me dá um erro "Você não tem permissão para acessar" quando navego em uma pasta.

    
por MartinC 30.03.2017 / 02:00

1 resposta

0

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.

    
por 30.03.2017 / 05:06