Eu tenho um servidor configurado onde desejo que um arquivo PHP específico possa ser lido através do navegador, mas quero que o acesso seja negado ao restante dos arquivos PHP. Então coloquei isso .htaccess
na raiz do servidor:
<Files "*.php">
Require all denied
</Files>
Então, coloquei isso em uma subpasta (digamos que a pasta seja subdir
) para corresponder a arquivos específicos:
<Files "folder/specific.php">
Require all granted
</Files>
Mas não funciona. Só funciona se eu colocar isso diretamente em subdir/folder/specific.php
:
<Files "*.php">
Require all granted
</Files>
Por que isso acontece assim? Mesmo se eu usar:
Order Allow, Deny
Allow from all
A mesma coisa acontece.
<Files>
não se espera que a diretiva tenha nenhum componente de caminho, apenas o componente de nome de arquivo base. Não deve haver barras no argumento da diretiva e*
não corresponde a barras (já que normalmente funciona no shell do sistema, aliás). Acore
documentação do módulo afirma:Obviamente, o nome base de um objeto do sistema de arquivos (o que vem depois do último
/
) não pode corresponder a nada que contenha uma barra.Como é sugerido na página que descreve as seções de configuração , para combinar arquivos específicos em diretórios específicos, você normalmente aninha
<Files>
dentro do correspondente<Directory>
:Isso implica que é errado escrever isso como um único arquivo
<Files "/var/web/dir1/private.html>
. No seu caso, suspeito que o servidor deveria estar reclamando em algum lugar do log de erros que.htaccess
possui uma diretiva incorreta.Como
.htaccess
não pode conter<Directory>
a seção e corresponde ao caminho do diretório em que ela é colocada, isso se traduz em adicionar sua<Files>
seção ao.htaccess
arquivo colocado no mesmo diretório onde os arquivos de destino estão localizados (ou qualquer um de seus pais), e não usar nenhum caminho dentro da directiva. Isso é exatamente o que você faz quando "só funciona".Observe também que a
.htaccess
documentação começa com :Portanto, o único benefício que oferecem é a capacidade de alterar alguma configuração do servidor sem acessar sua configuração. Todo o resto é possível; se você tiver esse acesso (e certamente tem, caso contrário a questão aqui estaria fora do tópico), você deve convertê-la
.haccess
em configuração no servidor e desabilitarAllowOverride
, removendo qualquer penalidade de desempenho incorrida. Os detalhes de como fazer isso são fornecidos na mesma página, no subcabeçalho Mesclar.htaccess
com os arquivos de configuração principais .