22
Feb

Proteger acceso a los contenidos generados por wordpress con .htaccess

[copiado literalmente de: http://sigt.net/archivo/directorios-con-contrasena-usando-htaccess-y-wordpress.xhtml] y basado en http://wordpress.org/support/topic/53771]

Si intentamos proteger mediante contraseña un directorio donde esté instalado Wordpress, este devuelve Error 404.

El problema viene de que WordPress mediante .htaccess coge control de las redirecciones para poder ofrecer permalinks y por ello al hacer un directorio protegido devuelve Error 404. 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/ o el fichero /failed_auth.html sea redireccionado por defecto (ignorando por tanto las clausulas del WordPress).

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

Ya que estamos: cómo proteger un directorio con htaccess y htpasswd

En el directorio a proteger toca poner un fichero .htaccess con el siguiente código:

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

El fichero file.txt tenemos que renombrarlo a .htpasswd y alojarlo en un sitio que no se pueda acceder por web. Si nuestras páginas accesibles al público están en tu-usuario/ht_docs/ entonces el fichero .htpasswd debe estar en tu-usuario/ pero nunca en tu-usuario/ht_docs. Esto es importante para evitar cualquier acceso accidental al fichero de contraseñas.

Eso es todo.

Leave a Reply