Hoje, ao querer proteger com login e password o directório /files debaixo do raíz do WordPress, depressa descobri que a tarefa não era tão trivial como isso. De facto, ao pesquisar no Google sobre o assunto, andava tudo à procura do mesmo, havendo mesmo um plugin para o efeito mas que parece ser opinião geral que não funciona muito bem. Não o experimentei, estou a vender ao preço que comprei.
O problema está no ficheiro .htaccess na raíz do WordPress com as Rewrite Rules que é assim:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
Basicamente e sem preciosismos que para aqui não interessam, o que isto faz é verificar se o pedido é para um ficheiro regular ou para um directório. Se não for nenhum dos casos, redirecciona para o index.php, a raíz do blogue. No caso dos directórios protegidos por .htaccess/.htpasswd, parece que o Apache se “confunde, pensando” que não é ficheiro nem directório o que leva o WordPress a mostrar um 404, uma vez que os dois pressupostos foram satisfeitos.
Para dois ficheiros tão simples como isto:
.htaccess:
AuthType Basic AuthName ficheiro AuthUserFile /path-to/files/.htpasswd require valid-user
.htpasswd:
ficheiro:kS3izewMeii8s
O trivial, mas não funciona.
O normal, seria colocar no topo do ficheiro .htaccess da raíz do WordPress as linhas:
ErrorDocument 401 /401.html
ErrorDocument 403 /403.html
Os ficheiros devem existir e conter pelo menos as tags <html></html>.
Mas não chega no caso do WordPress. É necessário adicionar ao topo do ficheiro index.php do WordPress, o código:
$request_filename = $_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI']; $this_dir = dirname(__FILE__).'/'; if($request_filename!=$this_dir && $request_filename!=__FILE__ && (is_file($request_filename) || is_dir($request_filename))) { die; }
Penso que isto é código a mais. Tentei alternativas mais curtas, mas tudo o que consegui foi uma página em branco no blog.
Agora sim, funciona :)
Se alguém quiser usar, escusado será dizer que está por sua conta e risco :P
E ah!, se tentarem isto e fizerem Copy & Paste, não se esqueçam de substituir os < e > pelos verdadeiros sinais de menor e maior.