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