Mis configuraciones más utilizadas de htaccess

domingo 07 noviembre 2010 | In English

El archivo .htaccess nos permite cambiar algunas de las configuraciones de un servidor de una carpeta en particular, y así mismo de sus subdirectorios. Mientras que es preferible realizar este tipo de configuraciones en el archivo de configuración del servidor utilizando una sección de <Directory>, a veces simplemente no tenemos acceso a este archivo de configuración, especialmente si tenemos una cuenta de hospedaje compartido. La mayoría de los proveedores de hospedaje compartido nos permiten realizar cambios en el comportamiento del servidor únicamente de esta manera.

El archivo .htaccess es un simple archivo de texto que nombramos así, nota el punto al principio de el nombre del archivo ya que esto es importante. Podemos editar este archivo en nuestro editor de texto favorito, y entonces subirlo a nuestro servidor, colocándolo en la carpeta donde queremos alterar el comportamiento.

Algunas de las cosas que podemos hacer con el archivo .htaccess son proteger una carpeta con contraseña, crear redireccionamientos, ajustar configuraciones de php, controlar el cache de los archivos, controlar como los archivos son tratados por el servidor basados en su extensión (podemos hacer que un archivo HTML sea pasado a través de el módulo de php en vez de solo servirlo), y en general alterar como los archivos se sirven a los visitantes.

Esta sección es casi seguro que será actualizada en el futuro con funcionalidad nueva, sin embargo, trataré de cubrir ahora los usos más comunes que tengo para este archivo.

Temas
Desactivando el listado de archivos en una carpeta sin un archivo index
Crear una redirección y cambiar la respuesta sobre el estado de archivos no encontrados
Creando páginas de error personalizadas
Ajustando el tiempo de expiración del cache de diferentes tipos de archivos
Comprimiendo los archivos antes de servirlos al navegador
Protegiendo un directorio con contraseña
Tratando los archivos HTML como archivos PHP
Cambiando configuraciones de PHP

Desactivando el listado de archivos en una carpeta sin un archivo index

Por default, cuando accedemos a una carpeta que no cuenta con un archivo index (ya sea .html, .htm, .php) en un sitio web, el servidor nos muestra un listado del contenido en la carpeta, el típico "Index of" seguido por todos los archivos y las subdirectorios en la carpeta a la que estamos accediendo. Esta configuración es particularmente peligrosa, ya que puede exponer la estructura interna de nuestro sitio web y/o proveer acceso a archivos e información que podríamos no querer que se mostrara públicamente pero que por alguna razón pusimos ahí.

Para deshabilitar esta configuración, podemos crear un archivo .htaccess en el directorio raíz de el sitio web y agregar la linea:

Options -Indexes

Crear una redirección y cambiar la respuesta sobre el estado de archivos no encontrados

Cuando pedimos un archivo de un servidor, y este archivo no es encontrado, por default el servidor regresa un código de estado 404, un estado que le indica al navegador (y a nosotros ya que el navegador nos presentará este código de error) que dicho archivo no está disponible. Pero este es solo un mensaje genérico, no nos indica nada sino el hecho de que justo en ese momento el archivo no está accesible. Sin embargo, a veces podemos indicarle al navegador por que el archivo no se encuentra actualmente ahí para que el navegador actúe de manera apropiada. Mis tres casos más utilizados son:

El archivo se movió permanentemente

El estado 301 le indica al navegador que el archivo ha sido movido permanentemente a un lugar diferente. Esta en una buena forma de implementar una redirección con .htaccess, ya que los navegadores con capacidad de edición de vínculos automáticamente actualizarán todas las referencias al archivo a la nueva dirección. Y esta respuesta puede ser agregada al cache, lo cual quiere decir que el navegador no continuará tratando de acceder a esta dirección, en su lugar intentará acceder a la nueva dirección del archivo. Solo agrega a tu archivo .htaccess la siguiente linea, indicando el archivo que fue movido, que puede ser cualquier tipo de archivo, y la nueva dirección de el archivo.

Redirect 301 /direccion/relativa/archivo.html http://www.dominio.tld/archivo.html

El archivo se movió temporalmente

El estado 307 le indica al navegador que el archivo fue movido, pero que este movimiento solo es temporal, el navegador seguirá la nueva dirección al igual que lo hace con el estado 301, pero no cambiará los vínculos al archivo, ni creará una entrada en el cache con esta nueva dirección (a menos que esto sea indicado por un control del cache o en una cabecera de expiración), el navegador continuará pidiendo la dirección original cada vez.

Redirect 307 /direccion/relativa/archivo.html http://www.dominio.tld/archivo.html

El archivo está perdido

El estado 410 le indica al navegador que el archivo que se está solicitando ha sido removido permanentemente del servidor. A diferencia del estado 404, que solo indica que el archivo no está ahí, este código de estado indica que tampoco va a estar ahí de nuevo.

Redirect 410 /direccion/relativa/desde/htaccess/archivo.html

Creando páginas de error personalizadas

En vez de enviar de vuelta al navegador un código de estado, para que este pueda presentarnos su propia página de error, podemos crear páginas de error personalizadas, por ejemplo para los errores 401 (No autorizado) y 404 (No encontrado). Todo lo que necesitamos hacer es modificar nuestro archivo .htaccess, agregando las siguientes lineas:

ErrorDocument 401 /direccion/a/401.html
ErrorDocument 404 /direccion/a/404.html

Ajustando el tiempo de expiración del cache de diferentes tipos de archivos

Este ajuste le indicará al navegador por cuanto tiempo debe de mantener el cache de los archivos para que no le pida al servidor estos mismos archivos cada vez que son necesarios, a esto es a lo que me refería cuando hablaba de control del cache. Lo que sucede aquí es que el servidor enviará una cabecera de "Expires" acompañando los archivos que sirve.

Podemos definir el tiempo de expiración por default con la directiva ExpiresDefault seguido por una base y un tiempo, o podemos especificar el tiempo de expiración de tipos específicos de archivos con ExpiresByType, seguido de un tipo de archivo, una base y un tiempo.

La base puede ser access o modification, donde access comienza a contar el tiempo desde la última vez que el navegador pidió el archivo, y modification comienza a contar el tiempo desde la última vez que el archivo fue modificado. Si usas una expiración basada en el tiempo de modificación, la cabecera Expires no será agregada al contenido que no venga de un archivo en el disco, como en el caso de una imagen generada al momento, esto por supuesto es debido a que un archivo que no existe no puede tener una fecha de modificación.

Respecto al tiempo, usamos este en conjunto con la base, agregando un plus y un tiempo, este tiempo puedes ser dado en segundos (seconds), minutos (minutes), horas (hours), días (days), semanas (weeks), meses (months) o años (years), y puede ser expresado de manera singular si solo es una unidad, podemos especificarlo como "1 minute" o como "10 minutes".

En este ejemplo voy a configurar un tiempo de expiración por default de un día para todos los archivos, utilizando la directiva ExpiresDefault, y después especificar tiempos de expiración diferentes para tipos de archivo comunes utilizando ExpiresByType.

<ifModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 1 day"
    ExpiresByType image/png "access plus 30 days"
    ExpiresByType image/jpeg "access plus 4 weeks"
    ExpiresByType image/gif "access plus 1 month"
    ExpiresByType image/x-icon "access plus 1 year"
    ExpiresByType application/javascript "modification plus 2 weeks"
    ExpiresByType text/css "modification plus 14 days"
</ifModule>

Comprimiendo los archivos antes de servirlos al navegador

Prácticamente todos los navegadores modernos tienen la habilidad de solicitar, aceptar y procesar la información recibida del servidor de manera comprimida, para así recudir el tiempo de carga de el sitio web cuando está siendo servido.

Para activar la compresión de archivos, en caso de que el servidor no esté configurado de esta manera por default, necesitamos agregar a nuestro archivo .htaccess la linea:

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/x-javascript application/rss+xml application/atom_xml text/javascript

No agregamos aquí imágenes ni otro tipo de contenido, por que nuestras imágenes y otros elementos ya deben de estar utilizando algún tipo de compresión. El servidor no comienza a servir todos los archivos de forma comprimida al hacer este cambio, solo lo hace cuando el navegador le dice que puede recibir información comprimida.

Protegiendo un directorio con contraseña

Para proteger los contenidos de una carpeta necesitamos crear una lista de nombres de usuario y contraseñas válidos, y agregar algunas lineas a nuestro archivo .htaccess . El nombre de usuario y la contraseña serán enviados como texto plano al servidor, así que esto es vulnerable a ataques de tipo hombre en el medio, a no ser que utilicemos SSL (altamente recomendado).

Comenzamos creando un archivo llamado .htpasswd, y cambiamos los permisos a 644.

touch .htpasswd
chmod 644 .htpasswd

Una vez hecho esto, necesitamos llenar el archivo con los nombres de usuario y las contraseñas (de preferencia y altamente recomendado que estén cifradas). Si estás utilizando Linux o algún otro sistema operativo basado en Unix y cuentas con el programa htpasswd esto es muy fácil de hacer, o aún mejor, si puedes acceder vía SSH a tu servidor puedes utilizar htpasswd para manejar los usuarios y las contraseñas en el mismo archivo. Si no, existes múltiples utilidades en linea que te permiten generar las contraseñas cifradas para utilizarlas en tu archivo .htpasswd (no confío en ninguna de ellas, pero son una persona paranoica). Aquí hay uno de esos sitios http://www.htaccesstools.com/htpasswd-generator/

Para generar la contraseña y guardarla junto con el nombre del usuario en el archivo, podemos utilizar:

htpasswd [archivo de contraseñas] [usuario]

por ejemplo:

htpasswd .htpasswd juan

Esto te pedirá la contraseña, y después la cifrará y la guardará en el archivo .htpasswd

Por default, si apache se encuentra instalado en cualquier sistema excepto Windows, Netware y TPF (Transaction Process Facility - Centro de procesamiento de transacciones, una computadora de IBM) utilizará la función crypt() para cifrar la contraseña. Utilizando este comando podemos crear cuantos usuarios queramos, así como cambiar las contraseña de usuarios ya existentes en el archivo.

Opcionalmente, podemos utilizar el parámetro -n para obtener los resultados del comando:

htpasswd -n juan

De nuevo, esto nos pedirá la contraseña, y nos regresará algo similar a esto:

juan:n94xSo6uSwhCY

Puedes abrir el archivo .htpasswd en tu editor de texto favorito y pegar la información, uno por linea si le darás acceso a múltiples usuarios.

Otras maneras de cifrar la contraseña pueden ser con MD5 utilizando el comando -m, esta es la configuración por default en Windows, Netware y TPF. O puedes usar SHA con el parámetro -s. Y el parámetro -d hace que htpasswd use la función crypt() pero esto ya es el comportamiento por default en la mayoría de los sistemas.

Algunos parámetros adicionales de htpasswd son -c que crea el archivo si este no existe, o lo reescribe y lo trunca si ya existía, dejando solo al nuevo usuario en el. El parámetro -D borrará un usuario de el archivo .htpasswd si este existe.

Y finalmente, en caso de que queramos utilizar este comando en conjunto con otros comandos, podemos utilizar el parámetro -b que nos permite especificar la contraseña en la linea de comandos. Por obvias razones, esta no es una forma segura de hacerlo, especialmente si los comandos están siendo registrados en un historial (podemos utilizar un espacio antes de el comando para prevenir que se guarde en nuestro historial, pero aún así, esta no es una manera recomendable de hacerlo).

htpasswd .htpasswd juan clavealeatoria

Una vez que terminamos de crear usuarios que podrán acceder al directorio y sus subdirectorios, necesitamos agregar las siguientes lineas a nuestro archivo .htaccess localizado en la carpeta que queremos proteger:

AuthName "Por favor identifíquese para poder acceder"
AuthType Basic
AuthUserFile /direccion/a/.htpasswd
Require valid-user

Donde AuthName es el texto que aparece en el cuadro de diálogo pidiéndonos el nombre de usuario y la contraseña. AuthType es el tipo de autenticación requerida, en este caso queremos un simple cuadro de diálogo pidiéndonos nuestro nombre de usuario y contraseña, así que utilizamos Basic. AuthUserFile es el archivo donde se encuentra guardada la lista de usuarios y contraseñas. Y finalmente Require valid-user hace que esta carpeta solo sea accesible a usuarios válidos, como se define en el archivo .htpasswd

Tratando los archivos HTML como archivos PHP

Para hacer que el servidor trate los archivos con extensión html (o con cualquier otra extensión) como archivos PHP, en decir, que no los sirva directamente al navegador sino que los pase por el modulo de PHP, necesitamos agregar lo siguiente a nuestro archivo .htaccess :

AddType application/x-httpd-php .htm .html

Actualización: PHP no siempre funciona como un módulo, algunas veces funciona como CGI (Common Gateway Interface, Interfaz de entrada común). Para alcanzar la misma cosa cuando PHP es usado como CGI usa el siguiente código:

AddHandler application/x-httpd-php .html .htm

En algunos servidores corriendo PHP como CGI el siguiente código también funcionaría:

AddHandler php5-cgi .html .htm

Cambiando configuraciones de PHP

Si no tenemos acceso al archivo php.ini, algunos proveedores de hospedaje nos permiten cambiar algunas configuraciones modificando el archivo .htaccess , por ejemplo, si estoy generando vistas previas de imágenes subidas como describía en algunas de mis publicaciones anteriores (vistas previas escaladas, vistas previas recortadas y escaladas), el límite por default de la memoria para PHP en algunos proveedores de hospedaje es tan baja como 2 MB, esto no es suficiente para procesar imágenes con los tamaños utilizados en estos días, así que cambio este limite a algo más grande, algo como 16 MB debe bastar para la mayoría de las imágenes. Pero esta no es la única configuración útil que podemos cambiar de el archivo de configuración php.ini, probablemente publicaré algo sobre esto después. El límite por default de la memoria para scripts de PHP se ha ido incrementando, el valor por default antes de PHP 5.2.0 era de 8 MB, tras PHP 5.2.0 fue incrementado a 16 MB, actualmente son 128 MB. Además, para no tener un límite en la memoria que pueden utilizar nuestros scripts, esto puede ser cambiado a -1 .

Para cambiar una configuración de PHP en nuestro archivo .htaccess , la opción AllowOverride Options (o AllowOverride all) debe de estar activada en el servidor. Si está activada, solo necesitamos agregar lo siguiente a nuestro archivo .htaccess:

php_value memory_limit 16M

Esto es, php_value, seguido de el nombre de la configuración, seguido de el nuevo valor.

Categorías: Apache, FOSS, PHP