.htaccess negar / permitir pasta específica dentro das minhas regras atuais

1

Estou usando uma regra .htaccess semelhante à abaixo:

# BEGIN Disable access to all files EXCEPT
Order deny,allow
Deny from all

# Files
<Files ~ ".(doc|xlsx|xlsm|xls|pdf|docx|txt|rtf|rdf|odf)$">
    Allow from all
</Files>
# Page Content
<Files ~ ".(css|js)$">
    Allow from all
</Files>
# Images
<Files ~ ".(jpe?g|png|gif|bmp|cur|ico|webp)$">
    Allow from all
</Files>
# Fonts
<Files ~ ".(svgz?|eot|otf|tt[cf]|woff2?)$">
    Allow from all
</Files>

No entanto, eu também quero permitir um arquivo .php específico, eu não quero ter que colocar uma regra .htaccess na pasta onde existe o arquivo .php específico, então eu tenho tentado fazer isso com FilesMatch

Aqui estão alguns exemplos:

<FilesMatch "\/folder1\/folder2\/folder3\/folder4\/\.(php)">
    Allow from all
    Satisfy Any   
</FilesMatch>

<FilesMatch "\folder1\folder2\folder3\folder4\file1.php">
    Allow from all
    Satisfy Any   
</FilesMatch>

Eu até tentei com /home/hostaccount/public_html/ no início do local e também /public_html/ no início do local.

Eu tentei adicionar ^ ao início do local e terminei com $ no final.

Alguém sabe o que estou fazendo de errado e, mais importante, como consertar isso?

    
por Ryflex 30.01.2017 / 13:54

1 resposta

2

Não há muita diferença entre <Files ~ "..."> ou <FilesMatch "..."> (ou <Files "..."> neste contexto), pois todos eles correspondem apenas ao nome de base do arquivo, excluindo o caminho do diretório.

Portanto, se o nome de base dos arquivos for exclusivo nessa árvore de diretórios, você poderá simplesmente fazer:

<Files "file-to-allow.php">
    Allow from all
</Files>

No entanto, isso corresponderá a file-to-allow.php em qualquer lugar dentro dessa árvore de diretórios, se o mesmo nome base de arquivo ocorrer em vários diretórios.

Se você precisasse corresponder ao caminho completo do sistema de arquivos (ou, falando estritamente, o caminho da URL), sem usar um arquivo .htaccess no subdiretório de destino e sem acesso à configuração do servidor (o que permitiria usar um <Directory> container), então você poderia talvez fazer algo como o seguinte, com a ajuda de mod_setenvif:

SetEnvIf Request_URI "^/path/to/file-to-allow\.php$" letmein

Allow from env=letmein

A diretiva SetEnvIf define a variável de ambiente letmein se a Request_URI corresponder à URL específica (regex). Isso é então usado na seguinte diretiva Allow para somente permitir se a variável de ambiente estiver definida.

    
por 30.01.2017 / 17:23