As diretivas <Location>
(e <LocationMatch>
) correspondem ao caminho da URL, não estritamente ao caminho do sistema de arquivos, portanto, não é necessariamente recomendado usá-lo para controlar o acesso de qualquer maneira (na configuração do servidor).
Se você tiver acesso à configuração do servidor, basta usar o contêiner <Directory>
relevante.
Sem usar .htaccess
no subdiretório, você poderia usar mod_setenvif para definir uma variável de ambiente condicionalmente com base na URL solicitada e, em seguida, bloquear com base nessa variável env.
Por exemplo:
SetEnvIf Request_URI "^/subdirectory/.+\.php$" BLOCK
<IfModule !mod_authz_core.c>
Order deny,allow
Deny from env=BLOCK
</IfModule>
<IfModule mod_authz_core.c>
<RequireAll>
Require all granted
Require not env BLOCK
</RequireAll>
</IfModule>
Eu inverti a diretiva Order
(Apache 2.2), caso contrário, sem uma diretiva Allow
adicional, tudo seria bloqueado.
As diretivas do Apache 2.4 precisam estar dentro de um contêiner <RequireAll>
, primeiro concedendo todo o acesso (caso contrário, tudo está bloqueado) e depois negando o acesso condicionalmente quando o BLOCK
env var estiver definido. Você não pode ter uma diretiva Require
negada - em um contêiner <RequireAny>
implícito - já que ela não terá nenhum efeito (na verdade, isso resulta em um erro 500).
Observe que isso bloqueia URLs, não estritamente como "arquivos". Bloqueia solicitações parecidas com .php
arquivos em /subdirectory
- independentemente de existirem realmente como arquivos físicos.
Como alternativa, você pode usar o mod_rewrite (Apache 2.2 e 2.4) no topo do seu arquivo root .htaccess
:
RewriteEngine On
RewriteRule ^subdirectory/.+\.php$ - [F]
Isso simplesmente bloqueia (403 Proibidas) todas as URLs que terminam em .php
e que estão no /subdirectory
solicitado. Se você especificamente precisar retornar apenas um 403 para URLs que mapeiam para arquivos reais, então você pode incluir uma condição adicional (embora isso seja provavelmente um desperdício desnecessário):
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^subdirectory/.+\.php$ - [F]
Altere F
para R=404
se você quiser retornar um 404.