I've tried adding
RewriteCond %{REQUEST_FILENAME} !-d
...
Diretivas em um contexto de servidor (ou vHost) executar antes a requisição foi mapeada para o sistema de arquivos, então a variável REQUEST_FILENAME
server ainda não contém o caminho do sistema de arquivos para o qual a URL mapeia ( ele simplesmente contém o URL).
Para verificar o caminho do sistema de arquivos em um contexto de servidor (se ele é mapeado para um arquivo ou diretório), é necessário usar um look-ahead. Tente o seguinte:
RewriteCond %{LA-U:REQUEST_FILENAME} !-d
RewriteRule !(\.pdf)$ - [F,NC,NS]
NB: tenha cuidado com os comentários de fim de linha; eles não são suportados pelo Apache.
O sinalizador NS
( nosubreq
) na diretiva RewriteRule
é necessário para impedir o bloqueio de sub-solicitações. Quando o mod_autoindex gera a listagem de diretórios, ele também faz sub-requisições adicionais em cada arquivo no diretório para buscar o tamanho do arquivo e os últimos registros de data e hora, etc. Você precisa impedir que sua verificação mod_rewrite seja acionada nessas sub-petições.
UPDATE: With the NS flag and without lookahead, it seems to work! But why is that the case? As you explained, lookahead should be necessary?
Se essas diretivas estiverem realmente dentro de um contêiner <Directory>
ou <DirectoryMatch>
(em outras palavras, elas estão em um contexto diretório , o mesmo que .htaccess
), será necessário usar o variável de servidor REQUEST_FILENAME
simples, sem o look-ahead.
Isso também parece ser consistente com a saída que você está vendo no log do servidor.