Directorios con contraseña usando htaccess... y WordPress

Autor: Armonth | El jueves 12 de julio del 2007 @ 01:44.

Ayer tuve que pelearme con un .htaccess + .htpasswd para proteger mediante contraseña un directorio y me encontré con que WordPress devuelve un ERROR 404 si proteges directorios.

El problema viene de que WordPress mediante .htaccess adquiere control "completo" de las redirecciones para poder ofrecer permalinks y por tanto hacer un directorio protegido falla. Esto se vuelve especialmente molesto si el blog está en el índice del dominio ya que las reglas htaccess se propagan a todos los directorios inferiores. Después de buscar un poco he encontrado al fin una manera de solucionarlo.

Justo encima del código de WordPress en nuestro fichero .htaccess debemos añadir esto:

<files .htaccess>
order allow,deny
deny from all
</files>

<ifModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^/directorio/(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^/failed_auth.html$
RewriteRule ^.*$ - [L]
</ifModule>

La primera parte es una medida de seguridad extra (opcional) para evitar que el fichero .htaccess pueda ser leído por un usuario accidentalmente. Cosa que normalmente no es posible pero existen excepciones.

La segunda parte lo que hace es que todo lo que esté dentro de /directorio/ y el fichero /failed_auth.html sea redireccionado de forma estándar (ignorando por tanto las clausulas del WordPress).

Realmente no hace falta crear el fichero failed_auth.html pero es necesario especificarlo para que funcione.

Cómo proteger un directorio con htaccess y

htpasswd ##

Ya que estamos, aprovecharé la entrada para comentar cómo proteger un directorio con htpasswd. Dentro del directorio "a proteger" toca crear un fichero htaccess con el siguiente contenido:

AuthName "Texto al gusto"   
AuthUserFile /ruta/al/fichero/.htpasswd   
AuthType basic   
Require valid-user

Lo único importante aquí es que la ruta al fichero .htpasswd debe ser correcta. Aparte de ello si queremos que sólo pueda acceder un usuario en particular podemos cambiar la última línea por:

Require user xxx

Donde xxx es el nombre del usuario. Ahora toca generar el fichero .htpasswd para ello podemos usar el comando htpasswd o un generador online:

$> htpasswd -c file.txt mi-usuario   
New password: mi-contraseña   
Re-type new password: mi-contraseña   
Adding password for user mi-usuario

Con esto nos genera un fichero file.txt con la sintaxis mi-usuario:contraseña-cifrada. Ese es el contenido que debe tener nuestro htpasswd.

Por último es importante que el fichero htpasswd esté alojado donde no se pueda acceder vía web. Si nuestras páginas están alojadas en la ruta $HOME/dominio.com/ht_docs (y por web se ve todo lo que hay dentro de ht_docs) entonces un buen sitio para guardarlo es en dominio.com o incluso en el $HOME.

Lo importante aquí es (y me repito) no poner el fichero htpasswd dentro de la web: aunque no se pueda acceder directamente siempre puede haber un fallo que permita acceso accidental (o no) y eso nos deja con las contraseñas comprometidas.

Eso es todo.

Comentarios