Apache, nos permite un sinfín de configuraciones y ajustes para ajustar nuestro servidor web a lo que queramos. De entre estas configuraciones, podemos proteger un directorio web mediante usuario y contraseña.

Proteger un directorio con contraseña

Lo primero que debemos de hacer es generar el usuario y contraseña en el formato adecuado, a través de esta web. Después lo copiamos y lo guardamos en un archivo .htpasswd que debemos de subir a la raíz del directorio que queremos proteger.

A continuación creamos un archivo .htaccess o si ya tenemos uno, añadimos estas líneas al final:

AuthType Basic
AuthName "Introduzca sus credenciales"
AuthUserFile /home/usuario/public_html/directorio/.htpasswd
require valid-user

lo subimos también al directorio raíz de la carpeta, junto con el .htpasswd.

Donde AuthUserFile es la ruta absoluta del archivo en el servidor, que podemos saber ejcutando el siguiente archivo en el servidor:

<?php
$dir = dirname(__FILE__);
echo "<p>Ruta al archivo .htpasswd: " . $dir . "/.htpasswd" . "</p>";
?>

Nota: el virtualhost que alberga el directorio al proteger, deberá de tener como mínimo la siguiente configuración:

<VirtualHost *:80>
 
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
 
        <Directory "/var/www/html">
                AllowOverride All
                Require all granted
         </Directory>
 
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
 
</VirtualHost>

Proteger un tipo de archivos de un directorio con contraseña

También podemos restringir la autenticación sólo para determinados tipos de archivos con FilesMatch:

<FilesMatch "nombrearchivo.extension">
AuthType Basic
AuthName "Introduzca sus credenciales"
AuthUserFile /home/usuario/public_html/directorio/.htpasswd
require valid-user
</FilesMatch>

donde podremos limitar el uso de contraseña a determinados archivos o extensiones usando REGEX:

<FilesMatch "\.(cache)$">