Que tal:
ErrorDocument 404 /404.php
RewriteEngine On
RewriteRule ^/robots\.txt$ /robots.real [L]
RewriteRule ^/[^/]*\.txt$ /404.php [L]
em que 404.php
é um documento que retorna 404 e robots.real
é o nome do seu robots.txt
.
Omita a primeira instrução ErrorDocument
se você não quiser projetar sua própria página de mensagem de erro, mas geralmente é bom ter uma, porque você pode então tê-la em seu próprio estilo, assim como executar lógica em para captar erros ortográficos e assim por diante.
Venha para pensar sobre isso, você provavelmente não precisa criar uma página 404 em tudo. Se você usar o mod_rewrite para fazer com que todos os documentos txt busquem uma página inexistente, como:
RewriteRule ^/[^/]*\.txt$ a-page-that-does-not-exist.html [L]
A razão pela qual seu exemplo na pergunta falha é porque a expressão regular [^robots]\.txt$
corresponde a tudo que termina em um caractere diferente de r, o, b, t, s seguido por .txt
.
Ao adicionar ^/
antes disso, você corresponderá todos os arquivos .txt de uma letra (exceto robts) na raiz.
O ^
no início da expressão regular significa o início do URI e, dentro dos colchetes, significa "não". Suportes significam "um dos caracteres dentro".
Se você adicionar um *
-sign ao regexp, isso significa zero ou mais ocorrências do que é imediatamente antes do *
.
Assim, ^/[^r/obts]*\.txt$
corresponderá a qualquer documento de texto na raiz que tenha qualquer número (incluindo 0) de quaisquer caracteres, exceto [r, /, o, b, t, s] terminando em .txt
, por exemplo /zzzfile.txt
, mas não /mysecretfile.txt
, porque contém r
e t
e s
. Ele também não corresponde a /xyz/xyz.txt
, devido ao /
dentro dos colchetes.
Isso está mais próximo do que você tentou fazer, mas não exclui apenas /robots.txt
, que é o que você deseja.
^/[^r/][^o/][^b/][^o/][^t/][^s/]\.txt$
corresponde a 6 caracteres, exceto robôs (mais a extensão .txt).