.htaccess (el archivo tiene un . al inicio!) es un archivo de texto oculto que contiene una serie de directivas para el servidor Apache.
Cuando un cliente solicita un archivo al servidor, este busca desde el directorio raíz hasta el subdirectorio que contiene el archivo solicitado el archivo .htaccess y tiene en cuenta estas reglas antes de proceder con la petición, es decir, se aplican las normas especificadas al directorio en el que se encuentre .htaccess y los directorios por debajo de él.
Ejemplos de usos para .htaccess pueden ser restringir el acceso a determinados archivos, impedir el listado de los archivos de un directorio, redireccionar, personalizar las páginas de error o impedir el acceso a determinadas IPs o rangos de IP.
Antes de comenzar a jugar con el .htaccess, debemos activarle al apache el que pueda interpretar los contenidos del fichero .htaccess. Para esto, sencillamente editamos /etc/httpd/conf/httpd.conf y buscamos sobre la línea 311 aproximadamente una sección que dice:
<Directory "/var/www/html">
Dentro de esta sección veremos una opción que dice:
AllowOverride None
Y la cambiamos a:
AllowOverride All
De lo contrario apache no interpretaría nuestros archivos .htaccess. Como siempre, debemos reiniciar apache para que tome la configuración cambiada:
service httpd restart
Impedir el listado del contenido de un directorio
Cuando se intenta acceder a un directorio, en ausencia de un archivo de índice, Apache muestra por defecto una página de bienvenida mas no muestra los archivos que contiene el directorio. O al revés, según la versión de apache y cómo lo tengamos configurado, a veces muestra el índice del directorio, esto es, todos los contenidos de un directorio.
Verifícalo haciendo:
mkdir /var/www/html/prueba
y luego accede con un navegador web a la IP de tu servidor (supongamos que es 1.2.3.4) /prueba, así:
http://1.2.3.4/prueba
Como puedes notar, te sale un índice creado por apache, porque dentro del directorio prueba no existe index.html
Si por el contrario lo que quisiéramos es no mostrar los índices del directorio cuando no aparezca el index.html, como es el caso nuestro, entonces podemos crear /var/www/html/.htaccess (fíjate en el . delante de htaccess) y agregar:
Options -Indexes
Si deseas que se vuelva a listar cómo harías? hay varias opciones para devolver todo como estaba antes:
- Eliminar el archivo .htaccess que creé
- cambiar a: Options +Indexes dentro del .htaccess que creé
- Comentar (#) la línea de Options que agregué en el .htaccess que creé.
Redireccionar el tráfico web
Si nos encontramos con la necesidad de enviar al usuario a una determinada dirección web cuando pida una cierta página, por ejemplo porque la hayamos movido, podemos utilizar la directiva Redirect de Apache.
Redirect /prueba/antiguo.php http://cursos.ernestoperez.com/moodle/
Esto hará que si alguien entra a /prueba/antiguo.php lo enviaremos hacia este otro sitio. Crear un mensaje de error personalizado Este es uno de los usos más frecuentes para el archivo .htaccess. En ocasiones se pueden producir errores que deben ser notificados al usuario, por ejemplo en el caso de que se intente acceder a una página que no existe, bien por un fallo del usuario al introducir la url, o bien porque la página haya sido movida o eliminada. Estos mensajes suelen estar escritos en inglés, no ofrecen demasiada información al usuario, y rompen la estética general del sitio, por lo que es imprescindible personalizarlos. Para lograrlo utilizamos la directiva ErrorDocument, del que tenemos un ejemplo a continuación:
ErrorDocument 403 "Acceso denegado" ErrorDocument 404 /404.php ErrorDocument 500 http://www.misitio.com/500.php
Los códigos de error 403, 404 y 500 son los más comunes, y se producen respectivamente cuando no se tiene permiso para acceder a una página, cuando no se encuentra un archivo y debido a un error interno del servidor. La primera línea indica al servidor que muestre el mensaje ‘Acceso denegado’ siempre que se produzca el error 403. Las otras líneas ilustran la forma de indicar al servidor que muestre una determinada página cuando se produzca un error (se puede usar direcciones relativas o absolutas).
Autorizando sólo a ciertas IPs
Es un tema muy fácil, a veces queremos denegar acceso a todos, excepto ciertas IPs o redes que sí quiero que entren. Para ellos hago lo siguiente dentro del .htaccess:
order deny,allow deny from all allow from 127.0.0.1 allow from 192.168.0.0/24
Las dos primeras líneas definen que nadie puede entrar por defecto. Las siguientes (allow from x.x.x.x) lo que indican son las IPs o redes autorizadas.
Una red finaliza con /24, /16, /8, o la máscara que desees
Protegiendo los directorios con clave
Este es uno de los usos más populares del .htaccess, que es el poder ponerle clave de acceso a un directorio. Para esto no sólo haremos uso del .htaccess sino que también tenemos que crear usuarios en mi linux con los comandos típicos “useradd” y “passwd”
- Lo primero que uno hace es verificar que el directorio que querramos proteger existe y se puede ver (sin clave). Por ejemplo yo usaré el http://127.0.0.1/prueba esto es, el directorio /var/www/html/prueba
- Luego instalaremos el paquete mod_auth_shadow y reiniciamos apache:
- yum -y install mod_auth_shadow
- service httpd restart
- Entonces creamos, en el directorio que vamos a ponerle clave (prueba/ en este caso) un archivo .htaccess el cual contendrá lo siguiente:
AuthName 'descargas' AuthShadow on AuthBasicAuthoritative off AuthType Basic AuthUserFile /dev/null require valid-user
Esto le indicará al sistema htaccess que valide los usuarios a través del archivo de shadow (/etc/shadow) pues utilicé el comando AuthShadow On y deshabilité el AuthBasicAuthoritative
AuthName es qué mensaje se nos mostrará en la pantalla de autenticación
AuthType indicará que usemos la autenticación básica, que nos sirve para validar contra shadow.
require nos indicará que requeriremos de un usuario valido, cualquiera sea el usuario, con tal de que exista en nuestro /etc/shadow
Por supuesto para poder probar, necesitaré utilizar un usuario en Linux con los comandos tradicionales: useradd usuario y passwd usuario
En caso de que querramos que sólo uno o dos usuarios de mi lista de usuarios que están en /etc/shadow sean los que puedan entrar al sistema, entonces podemos editar nuestro .htaccess y en vez de require valid-user podríamos poner:
require user ernesto invitado
Con esto bastará para que, independientemente de la cantidad de usuarios que tengamos en /etc/shadow, sólo los usuarios ernesto e invitado puedan entrar a éste directorio.