worldwideweb.jpg

Los archivos .htaccess son contenedores de reglas que el servidor web Apache reconocerá a la hora de cargar tu sitio. Estos archivos son muy útiles antes y durante la construcción de una web, por ello presento 20 ejemplos de cómo podemos sacar provecho de las funcionalidades que brinda.

Preparación

Antes que nada debemos asegurarnos de que los archivos .htaccess realmente esten habilitados en nuestro servidor Apache. Para ello es necesario y suficiente que en /etc/apache2/site-available/default se incluya la opción:

AllowOverride All

en la definición de los directorios que deseemos utilizar.

Los 20 ejemplos

1) Personalizar el Error 404

Se puede personalizar el clásico error 404 de página no encontrada añadiendo esta línea a tu archivo .htaccess:

ErrorDocument 404: "Esta página no esta disponible"

o bien redirigir a un archivo (por ejemplo html):

ErrorDocument 404 /error404.html

De esta misma manera se puede hacer con los demas errores como el 403 de acceso denegado.

2) Protección a un directorio

Se puede proteger directorios con usuario y contraseña, esto es útil para controlar quienes pueden navegar los archivos o no. Primero se debe crear un archivo .htpasswd que es donde se guardará los datos del usuario. Este archivo puede estar en el directorio raíz pero NO en el que queremos proteger.

Creamos el archivo .htpasswd

$ touch /var/www/misitio/.htpasswd

y luego para dar de alta a un usuario podemos escoger dos caminos, uno es utilizando una herramienta online que encriptará la contraseña que ingresemos, luego tan solo debemos copiar y pegar lo que nos devuelva en el archivo .htpasswd. El otro camino es utilizando el comando htpasswd de la siguiente forma:

$ htpasswd /var/www/misitio/.htpasswd admin

a continuación nos pedirá que ingresemos una contraseña y listo esta cuenta queda guardada en el archivo. Ahora solo falta crear el .htaccess para el directorio que queremos proteger, para ello nos dirigimos a ese directorio y dentro de el creamos un archivo .htaccess y escribimos lo siguiente:

AuthName "Este directorio es privado"
AuthUserFile /var/www/misitio/.htpasswd
AuthType basic
Require valid-user

3) Evitar navegar los directorios

Es muy sencillo evitar que se navegue el contenido de los directorios del nuestro sitio, para ello basta con agregar la siguiente línea al .htaccess que esta en la raíz:

Options All -Indexes

4) Bloqueo de IPs

En caso de un ataque o por razones de seguridad puede ser necesario bannear una ip:

Order allow, deny
Deny from xxx.xxx.xxx.xxx
Allow from all

Cambia xxx.xxx.xxx.xxx por la ip que desees bannear o en vez de una dirección ip puede ser un dominio:

Order allow, deny
Deny from dominio.banneado.com
Allow from all

5) Límite de visitas

Esta opción limita el número de visitantes a tu sitio a 300 en el mismo momento:

MaxClients 300

6) Cambiar la página principal

Con esta opción le indicas al servidor que tu página de inicio no es la típica index sino la que tu desees:

DirectoryIndex otroindex.html

7) Redireccionamiento

Existen muchas formas de redireccionar a tus visitantes a otro lugar. Estos son algunos de ellos:

Redirect / /otro_dir/
Redirect /index.php /nuevo.php
Redirect /files/doc.zip http://nuevo.com/files/doc.zip

8) Anti hot linking

El hot link es la acción de enlazar en un sitio ajeno un archivo que esta alojado en nuestro servidor. Esto implica consumo de ancho de banda y es algo indeseable por ello se puede aplicar la siguiente regla:

RewriteEngine On
RewriteCond % !^$
RewriteCond % !^http://(www\.)?dominio.com/.*$ [NC]
RewriteRule ^.*\.(bmp|tif|gif|jpg|jpeg|jpe|png)$b - [F]

9) Obligar a descargar archivos

Esta opción obliga a que los archivos no sean abiertos en el navegador sino descargados por el cliente:

AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .txt
AddType application/octet-stream .pdf .odt .doc

Para uno en particular sería:

<Files archivo_particular.txt>
AddType application/octet-stream txt
</Files>

10) Configuración del host

Puedes escribir tu configuración personalizada:

#Indica el orden de precedencia de ejecución de los index
DirectoryIndex index.html index.php index.htm
#El lenguaje por defecto
DefaultLanguage es-ES
#La codificación por defecto
AddDefaultCharset UTF-8
#Activar (on), desactivar (off) o mostrar email (email) para la firma del sevidor en los mensajes
ServerSignature Off
#Establecer el email del administrador
SetEnv SERVER_ADMIN webmaster@dominio.com

11) Protección de archivos

Deniega el acceso a los archivos que especifiques:

#protege los .htaccess, .htpasswd, .ini, .log
<FilesMatch "\.(htaccess|htpasswd|ini|log)$">
  Order Allow,Deny
  Deny from all
</FilesMatch>

#Protege un archivo en particular y pide contraseña
<Files config.php>
Order deny,allow
Deny from all
AuthName "Acceso restringido"
AuthType Basic
AuthUserFile /.htpasswd
Require valid-user
</Files>

12) Permitir el acceso sólo a algunas IPs o dominios

Similar al ejemplo anterior protegemos un directorio o el directorio raíz y solo permitimos el acceso a quien deseemos:

Order deny,allow
Deny from all
Allow from 192.168.0.1 192.168.0.2
Allow from www.exclusivo.com

13) Redireccionar todo el tráfico menos una ip o dominio

Este tipo de redireccionamiento es muy útil cuando el sitio esta bajo construcción:

ErrorDocument 403 http://www.nuevositio.com
Order deny,allow
Deny from all
Allow from 200.10.45.120
Allow from desarrolladores.com

14) Limitar los tipos de archivos a subir (upload)

Se puede controlar que tipos de archivos permitimos subir desde un cliente a nuestro sitio de la siguiente forma:

AddType image/jpeg .jpg
AddType text/plain .txt .xml .html .css

15) Evitar mostrar ciertos tipos de archivos

Este ejemplo ignorará la existencia de archivos de la extensión indicada:

IndexIgnore *mp3 *.avi *.mpeg

16) Determinar el tiempo en caché de los archivos

Con el fin de optimizar y agilizar tu sitio puedes determinar el tiempo en caché según el tipo de archivo que sea de acceso público (el tiempo esta expreasado en segundos):

# 1 mes
<FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
Header set Cache-Control "max-age=6480000, public"
</FilesMatch>

# 1 semana
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>

# 1 hora
<FilesMatch "\.(txt|xml|js|css)$">
Header set Cache-Control "max-age=3600"
</FilesMatch>

# No usar caché
<FilesMatch "\.(html|htm|php|cgi|pl)$">
Header set Cache-Control "max-age=0, private, no-store, no-cache, must-revalidate"
</FilesMatch>

17) Redirecciona los logs

Con esta regla podrás ver los logs del servidor en un archivo de texto:

ErrorLog /files/error.log

18) Obligar a escribir www

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond % !^www\.dominio\.com$ [NC]
RewriteRule ^(.*)$ http://www.dominio.com/$1 [R=301,L]

19) Desahabilitar la ejecución de scripts indeseados

Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .sh .cgi

20) Dengar métodos de comunicación

RewriteCond % !^(GET|HEAD|OPTIONS|POST|PUT)
RewriteRule .* - [F]

Toda una colección de ejemplos en AskApache

 

  •  
    avatar
    rauldm 17/11/2009 10:48:53
    Hola, muchisimas gracias por este post tan interesante.
    Soy un novato total y no tengo ni idea. He protegido todo mi site tal y como tu explicas con el htaccess y el htpasswd. Ahora lo que me gustaría es
    que según quien se logee, que vaya a una pagina de inicio personalizada.

    Es decir, quiero tener un Home personalizado para cada user según vayan accediendo a la web. Es possible? podrias sugerirme como?o ayudarme en donde
    buscar?? muchas gracias por la ayuda!!!!!!!!!!!!!
  •  
    avatar
    luis 17/11/2009 11:43:23
    Hola, si entendi bien lo que necesitas que cada sitio tenga un directorio host diferente en tu servidor. Eso se hace en
    /etc/apache2/site-available/default en los bloques VirtualHost aqui puedes ver una configuración básica:
    http://www.larepaweb.com.ar/index.php?id=article&a=526

    Espero que ayude.
  •  
    avatar
    rauldm 17/11/2009 12:04:40
    mmm pues no se si es eso..jeje. yo quiero tener una web normal, pero con un acceso controlado con htpasswd y htaccess. dentro de htpasswd tengo varios
    usuarios admitidos. Lo que quiero es que por ejemplo si quien se loguea es Luis, vaya a una pagina home para poder poner Hola Luis...
    Pero si se conecta Raul, quiero que vaya a otro home que diga Hola Raul..

    es esto possible? ademas estoy teniendo problemas con mi htpasswd y/o htaccess. De repente peta en Firefox todo. Me pide una y otra vez la
    contraseña. COmo si no la reconociese o fuese incorrecta. En safari no me pasa (uso mac) alguna idea?

    muchas gracias!!!!!!!!!!!
  •  
    avatar
    luis 17/11/2009 16:10:11
    Haaa ya entendi. Algo como lo que hace cpanel o phpmyadmin que capura el login. Tendrás que escribir un script en php como lo indica estos links:

    http://php.net/manual/en/features.http-auth.php
    http://tutorialphp.net/cap8_2seguridad_distincion_de_usuarios_php.php
    http://www.hospedajeydominios.com/mambo/documentacion-manual_php-pagina-features_http_auth.html

    Suerte.
  •  
    avatar
    XMEN 15/12/2009 22:29:40
    muchas gracias por la info, me ha sido de gran ayuda!
Nombre (requerido)
Email (requerido)
Web (incluir http://)
Escribe el resultado de: 68 + 79 =
Publicar mi correo