proteger directório em wordpress
24/Out/2008 @ 14:36 Software

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.

-MG
rss não há pás de carvão neste artigo, atira-lhe uma
atira-lhe uma pá de carvão

Nota: Todos os comentários são moderados.