Introducción
Los archivos htaccess
permiten controlar hasta cierto punto el acceso a
zonas de un web ó incluso a todo él, estando incluídos dentro del árbol de
directorios de páginas del servidor web. Es por eso por lo que también se les
llama archivos de configuración distribuida.
Un archivo htaccess
protege el directorio en el que se encuentra y todos
los que hay por debajo de él. Para cambiar esta herencia de restricciones se
pueden emplear otros archivos htaccess
en niveles inferiores.
Puede emplearse para tareas como:
- Proteger accesos mediante contraseñas, bien a directorios, bien a archivos concretos.
- Desproteger zonas para permitir el acceso (como páginas personalizadas de error)
- Habilitar SSI
- Denegar acceso por origen de la conexión (dirección IP).
- Cambiar la página índice predeterminada
- Efectuar redirecciones temporales ó permanentes
- Otras acciones más exóticas:
- Prevenir el robo de ancho de banda (hotlinking) mediante el enlace directo a imágenes (mod rewrite).
- Transformar los URL para corregirlas ó normalizarlas (también mediante
mod_rewrite
).
Configuración en el servidor
Para poder usar estos archivos en toda su extensión es necesario indicar a Apache que tal posibilidad existe, ya que es posible que el administrador del sitio prefiera tener él todo el control sobre permisos de acceso.
AccessFileName
Esta directiva permite cambiar el nombre del archivo de configuración, cuyo
valor predeterminado es .htaccess
por otro distinto.
Dada una configuración como esta:
AccessFileName .acl
cuando se solicita acceso a un archivo como /usr/local/web/index.html (después de traducir URL a ruta física, claro), el servidor web buscará y leerá antes los siguientes archivos:
- /.acl
- /usr/.acl
- /usr/local/.acl
- /usr/local/web/.acl
siempre que esta característica no esté deshabilitada por completo con algo como
AllowOverride
Esta directiva
es la que se emplea para determinar qué opciones dentro de un archivo
.htaccess
pueden contradecir a las opciones generales. Sólo puede emplearse
(en Apache2) en una sección Directory
sin posibilidad de equívocos respecto
a la ruta (vamos, que sin expresiones regulares que valgan).
Los posibles parámetros que puede tomar son:
None
: los archivos.htaccess
son ignorados por completo.All
: todas las directivas posibles están permitidas.- Grupo de directivas, lo que quiere decir que permite según grupo lo
siguiente:
AuthConfig
: directivas autorizativas comoAuthName
yRequire
FileInfo
: directivas que controlan el tipo de archivos comoErrorDocument
,SetHandler
,DefaultType
and las relacionadas conmod_mime
.Indexes
: control de indexación de contenidos comoDirectoryIndex
,AddType
yReadmeName
.Limit
: control de acceso según nodos de red (Allow
,Deny
, ...)Options
: Características específicas de los directorios entre las que se cuentan:ExecCGI
FollowSymLinks
Includes
SymLinksIfOwnerMatch
MultiViews
Mezclando directivas
El contenido de un archivo htaccess
puede contradecir las directivas
establecidas en la configuración del servidor para el directorio en cuestión ó
en un archivo htaccess
de un nivel superior, puesto que hemos visto que se
leen por orden.
¿ Qué podemos hacer cuando queremos tocar algo pero no todo ? Es posible utilizar modificadores delante de las directivas como caracteres más (+) y menos (-) para habilitar y deshabilitar respectivamente.
En el siguiente ejemplo vemos cómo desactivar la ejecución de programas desde el directorio raíz:
1 <Directory /> 2 Allowoverride All 3 </Directory> 4 5 <Location /> 6 Options +IncludesNoExec -ExecCGI 7 </Location>
Usos concretos de htaccess
Proteger zonas con contraseñas
Es tan fácil como incluir ésto en un archivo .htaccess
:
1 AuthType Basic 2 AuthName "Password Required" 3 AuthUserFile /etc/apache/passwd/users 4 AuthGroupFile /etc/apache/passwd/groups 5 Require Group admins
y en este caso sólo se permite acceso a los usuarios dentro del grupo de administradores. Se incluye el archivo de usuarios porque es la primera comprobación que debe hacer, para proceder después a mirar si ese usuario está dentro del grupo de administradores.
Por supuesto, existe un tutorial completo que explica muchos más casos y desvela todas las incógnitas al respecto ;-)
Pero por si acaso, voy a incluir aquí una referencia de algunas claúsulas que siempre hecho de menos tener a mano:
Require
Esta claúsula indica qué usuarios correctamente identificados pueden acceder al recurso.
Los parámetros son:
- Require user nombre-de-usuario [nombre-de-usuario ...]
- Require group nombre-de-grupo [nombre-de-grupo ...]
- Require valid-user
Satisfy
Para despejar dudas de una vez por todas: esta claúsula efectúa una operación OR ó AND sobre los dos sistemas de control de recursos Allow y Require y no, como se confunde a veces, entre dos ó más claúsulas require.
Satisfy All
Indica que deben cumplirse las condiciones de la claúsula Allow y las de la claúsula Require.
Satisfy Any
Indica que basta con que se cumpla una de las dos.
Problemas
La documentación de Apache a este respecto menciona que