Eu tenho estes dois conjuntos de regras no .htaccess:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://my\.site\.com\/ [NC]
RewriteRule .*\.(gif|jpg|png)$ - [NC,L,F]
O primeiro conjunto é um índice padrão do Drupal, e o segundo conjunto é minha própria regra, com o objetivo de impedir o hotlink e o acesso direto às imagens.
Pelo que entendi, se alguém digitar my.site.com/some.jpg
diretamente no navegador, o primeiro conjunto de regras não o detectará por causa de sua primeira condição (url é um nome de arquivo existente regular), mas o segundo conjunto de regras deve retornar um 403 Código de status proibido para o cliente (porque não há nenhum referenciador e o padrão termina com .jpg).
Aqui está o que acontece: Eu recebo muitas entradas no log db do Drupal error com nomes de arquivos jpg e nenhum referenciador. Então isso significa que essas requisições atingiram index.php, porque o Apache não pode gravar em log db, somente o Drupal pode.
Minha pergunta: é possível e como fazer isso para parar essas requisições acessando index.php e retornar 403 diretamente para o cliente?
Mover o segundo conjunto de regras (com jpg) antes do primeiro conjunto de regras (índice catch-all) não ajudou. Comentar a condição com o referenciador vazio ( RewriteCond %{HTTP_REFERER} !^$
) ajudou, as entradas no log do banco de dados pararam de aparecer, mas o objetivo é também bloquear as solicitações com o referenciador vazio.
Tags mod-rewrite