You are on page 1of 10

.

htaccess

.htaccess 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.

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 el contenido del directorio. Si queremos impedir al usuario ver el
contenido de un directorio, bastaría con crear un archivo de índice, por ejemplo index.html,
pero existe una solución más elegante mediante la directiva Options. Basta crear un archivo
.htaccess que contenga la línea:
Options -Indexes
También podríamos utilizar la directiva DirectoryIndex, que especifica qué archivos actúan
como índice por defecto, y que archivo mostrar en el caso de que estos no se encuentren.
Por ejemplo la línea:
DirectoryIndex index.php index.html index.htm /prohibido.php
indicaría al servidor que debe buscar los archivos index.php, index.html o index.htm, en ese
orden, y en el caso de no encontrar ninguno de ellos, cargar el archivo prohibido.php.

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 hallamos movido, podemos utilizar la
directiva Redirect de Apache.

Redirect /antiguo.php http://mundogeek.net/otros/nuevo.php

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 /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).

Tutorial de .htaccess
Posted Abril 3rd, 2006. Filed under internet tutoriales

Para aquellos que pelean contra WP y el formato de links. Y también para quien lo necesite
una pequeña recopilación de consejos para poder crear y modificar el archivo misterioso
que todo lo puede :p.

Notas de traducción

 Esta traducción fue realizada bajo permiso expreso y por escrito – en e-mail – del
autor: Paolo Tagliaferri (que le manda saludos a Pampita)
 Tanto el artículo original como su traducción se encuentra bajo licencia Creative
Commons Atribución-NoComercial-SinDerivadas
 Los vínculos fueron mantenidos así que éstos seguramente se encontrará en inglés
 Artículo Original: Apache .htaccess tweaking tutorial

Si a alguien se le ocurre algo para agregar/modificar/corregir al tutorial sólo deje un


comentario y vemos cómo hacemos.

La traducción

En este tutorial mejoraremos nuestro sitio web modificando el archivo .htaccess.¿Por qué
escribí este artículo? Porque en la red encontré un montón de artículos sobre esta pequeña
bestia pero cada uno de ellos englobaba un problema en particular y no el uso general del
archivo, o eran demasiado grandes cuando uno necesitaba algo en poco tiempo. Por lo que
estoy intentando recopilar todas los datos útiles en un tutorial sencillo pero monolítico, que
será actualizado a medida que consiga más información. Primero sin embargo, veamos qué
es un archivo .htaccess.

Esto es lo que dice la definición de la wikipedia [en inglés]:

.htaccess (Acceso de Hiper-Texto) es el nombre por defecto del archivo de configuración


de directorios de Apache. Provee de la habilidad para personalizar la configuración de las
directivas definidas en el archivo de configuración principal. Las directivas de
configuración necesitan estar en el contexto de .htaccess y el usuario necesita los permisos
apropiados.

Ahora veamos los problemas más comunes.

Índice (Última actualización: 28 de Febrero de 2006)

1. Control de acceso a carpetas


2. Listado de carpetas
3. Activación de compresión
4. Escondiendo archivos
5. Páginas de error HTTP 404 personalizadas
6. Bloqueo de referers maliciosos – Nada de hotlinking
7. Bloqueo de robots maliciosos
8. No mostrar ‘wwww’
9. Escondiendo la extensión del lenguaje de scripting
10. Consejos y trucos varios
11. Protección con contraseña mediante htpasswd
12. Activando SSI
13. Cambiando la página por defecto
14. Evitando el error 500
15. Directiva CheckSpelling [Control de Ortografía]
16. Agregar sumario MD5
17. Fuentes
18. Herramientas

Control de acceso a carpetas

Podrías querer deshabilitar totalmente el acceso a una carpeta (por ejemplo, una carpeta
con librerías de programación que se incluyen en los archivos principales. En este caso sólo
los archivos principales accederána ellos mediante el sistema de archivos, pero no se
podrán acceder via web). Bueno, simplemente crea un archivo .htaccess en esa carpeta que
contenga:

#deny all access


deny from all

Si se quiere permitir el acceso desde una IP específica


#deny all access
deny from all
allow from 10.0.0.1

o para un rango específico de IPs (forzado mediante la máscara de red)

allow from 192.168.0.0/24

también se puede bloquear el acceso a un archivo específico

<Files privado.html>
Order allow,deny
Deny from all

Listado de carpetas

Si se quiere hacer las carpetas navegables, entonces necesitamos agregar esta línea al
archivo .htaccess

Options +Indexes +MultiViews +FollowSymlinks

Y esta si se tiene el módulo apropiado en el servidor web

IndexOptions FancyIndexing

También se podría querer prevenir el listado de carpetas

IndexIgnore *

Activar compresión

Se puede habilitar la compresión de datos inherente de PHP para ahorrar ancho de banda

php_value zlib.output_compression 16386

Escondiendo archivos

Para deshabilitar el acceso a un archivo en particula se puede utilizar una expresión regular
y la directiva Files para denegar acceso a cualquier archivo que comience con .ht

Se puede modificar esto para restringir un archivo en particular (como archivos de


configuración, robots.txt, archivos de logs o lo que se desee).

Order allow,deny
Deny from all
Satisfy All

Páginas de error HTTP 404 personalizadas

Si se quisiera redireccionar los visitantes cada vez que se encuentran con una página de
error HTTP 404, utiliza éste código:

ErrorDocument 404 /errores/noencontrado.html

Esto redirije el usuario hacia /errores/noencontrado.html cada vez que sucede un error 404.
Obviamente, se puede redefinir para que capture otros errores http (403, 5000, etc). Sigue
leyendo para ver lo que encontré

Consejo: Internet Explorer tiene una “funcionalidad” poco documentada que previene la
utilización de cualquier página de error 404 personalizada que sea menor a 512 bytes de
largo. Los visitantes serán enviados, en cambio, a la página propia de IE, que es genérica y
sugiere que utilizen una búsqueda en MSN para buscar la información en internet. ¡Esa es
una forma de perder visitantes! Asegúrate que tu página personalizada esté por sobre este
límite – algo así como 10 líneas completas de texto y HTML deberían ser suficientes.

Bloqueo de referers maliciosos – Nada de hotlinking

Si se desea bloquera algunas partes del sitio de cualquier referer malicioso:

RewriteEngine on
RewriteCond %{HTTP_REFERER} ejemplo\.com [NC,OR]
RewriteCond %{HTTP_REFERER} otroejemplo\.com
RewriteRule .* - [F]

Utilizando el motor rewrite [de reescritura] se denegará el acceso al sitio a cualquier


visitante que venga de chicomalo.com u otrositiodesagradable.com. Para evitar el robo de
ancho de banda, se puede bloquear el acceso a un archivo en particular (o extensión de
archivos).

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://([-a-z0-9]+\.)?example\.com[NC]
RewriteRule .*\.(zip|mp3|avi|wmv|mpg|mpeg)$
http://www.example.com/images/nohotlink.gif [R,NC,L]

Esto dice: “si el visitante no proviene de misitio.net, entonce redirije todos los pedidos de
archivos (zip,mp3,avi,wmv,mpg,mpeg) a una imagen que dice “No permitimos hotlinking”
De esa forma, puedes redirigir a una página, o lo que desees, o p uedes modificar la lista de
extensíones de archivo para incluir/quitar otros archivos. Cuidado: cuando se decide
bloquera el hotlinking de imágenes recuerda que puedes estar bloqueando todo tráfico fuera
del alcance de tu dominio. Por ejemplo, si se posee un archivo de sindicación tomado por
bloglines necesitarás modificar la regla para permitirles a los lectores obtener las imágenes
– o el RSS se verá mal.

Bloqueo de robots maliciosos

En algunos casos se querrá bloquear algunos robots maliciosos, como spiders o


descargadores. Para ello utilizaremos mod_rewrite nuevamente. Normalmente los robots
maliciosos ignoran el archivo de directivas robots.txt por lo que se podría querer forzar un
error 403 cada vez que quieran recorrer o descargar tu sitio:

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [OR]
RewriteCond %{HTTP_USER_AGENT} ^Bot\ mailto:craftbot@yahoo.com [OR]
RewriteCond %{HTTP_USER_AGENT} ^ChinaClaw [OR]
RewriteCond %{HTTP_USER_AGENT} ^Custo [OR]
RewriteCond %{HTTP_USER_AGENT} ^DISCo [OR]
RewriteCond %{HTTP_USER_AGENT} ^Download\ Demon [OR]
RewriteCond %{HTTP_USER_AGENT} ^eCatch [OR]
RewriteCond %{HTTP_USER_AGENT} ^EirGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailWolf [OR]
RewriteCond %{HTTP_USER_AGENT} ^Express\ WebPictures [OR]
RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro [OR]
RewriteCond %{HTTP_USER_AGENT} ^EyeNetIE [OR]
RewriteCond %{HTTP_USER_AGENT} ^FlashGet [OR]
RewriteCond %{HTTP_USER_AGENT} ^GetRight [OR]
RewriteCond %{HTTP_USER_AGENT} ^GetWeb! [OR]
RewriteCond %{HTTP_USER_AGENT} ^Go!Zilla [OR]
RewriteCond %{HTTP_USER_AGENT} ^Go-Ahead-Got-It [OR]
RewriteCond %{HTTP_USER_AGENT} ^GrabNet [OR]
RewriteCond %{HTTP_USER_AGENT} ^Grafula [OR]
RewriteCond %{HTTP_USER_AGENT} ^HMView [OR]
RewriteCond %{HTTP_USER_AGENT} HTTrack [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Stripper [OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} Indy\ Library [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^InterGET [OR]
RewriteCond %{HTTP_USER_AGENT} ^Internet\ Ninja [OR]
RewriteCond %{HTTP_USER_AGENT} ^JetCar [OR]
RewriteCond %{HTTP_USER_AGENT} ^JOC\ Web\ Spider [OR]
RewriteCond %{HTTP_USER_AGENT} ^larbin [OR]
RewriteCond %{HTTP_USER_AGENT} ^LeechFTP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mass\ Downloader [OR]
RewriteCond %{HTTP_USER_AGENT} ^MIDown\ tool [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mister\ PiX [OR]
RewriteCond %{HTTP_USER_AGENT} ^Navroad [OR]
RewriteCond %{HTTP_USER_AGENT} ^NearSite [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetAnts [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetZIP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Octopus [OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Explorer [OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Navigator [OR]
RewriteCond %{HTTP_USER_AGENT} ^PageGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} ^Papa\ Foto [OR]
RewriteCond %{HTTP_USER_AGENT} ^pavuk [OR]
RewriteCond %{HTTP_USER_AGENT} ^pcBrowser [OR]
RewriteCond %{HTTP_USER_AGENT} ^RealDownload [OR]
RewriteCond %{HTTP_USER_AGENT} ^ReGet [OR]
RewriteCond %{HTTP_USER_AGENT} ^SiteSnagger [OR]
RewriteCond %{HTTP_USER_AGENT} ^SmartDownload [OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperBot [OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperHTTP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Surfbot [OR]
RewriteCond %{HTTP_USER_AGENT} ^tAkeOut [OR]
RewriteCond %{HTTP_USER_AGENT} ^Teleport\ Pro [OR]
RewriteCond %{HTTP_USER_AGENT} ^VoidEYE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Image\ Collector [OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebAuto [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebCopier [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebFetch [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebGo\ IS [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebLeacher [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebReaper [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebSauger [OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ eXtractor [OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ Quester [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebStripper [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebWhacker [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebZIP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Wget [OR]
RewriteCond %{HTTP_USER_AGENT} ^Widow [OR]
RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus
RewriteRule .* - [F]

(La lista se obtuvo de aquí)

No mostrar ‘wwww’

Para hacer esto, basta con una simple regla de re-escritura:

Options +FollowSymlinks
RewriteEngine on
RewriteCond %{http_host} ^www\.example\.com[nc]
RewriteRule ^(.*)$ http://example.com/$1 [r=301,nc]

¿Por qué querría quitar ‘www’? En ese link los fundamentos


Escondiendo la extensión del lenguaje de scripting

Se puede aumentar la seguridad cambiando la extensión de los scripts para que los
visitantes desconozcan qué lenguaje estás utilizando:

# Make PHP code look like unknown types


AddType application/x-httpd-php .cool

De esta forma, los archivos .cool serán tratados como si fuesen archivos PHP. Se deben
renombrar los archivos que se quiera con esta nueva extensión.

Consejos y trucos varios

 Mantiene el archivo .htaccess pequeño: este archivo es procesado por el


servidor web en cada pedido (pudiendo causar problemas de performance).
 Mantiene tu archivo .htaccess organizado. Utiliza comentarios (líneas que
comienzan en #) y se lógicamente consistente. Es complicado entender un
archivo .htaccess desorganizado una vez que crece lo suficiente.
 Cuando se utilicen reglas de reescritura de URLs, agrega la opción [L] a
aquellas páginas finales (como la de hotlinking y demás). Esto le dirá al
servidor que no procese más reglas (aumentando la performance).
 Cuidado con la herencia: el archivo .htaccess a nivel raíz es aplicado
también en las carpetas, cuaquier regla .htaccess en la carpeta puede
reemplazar las reglas de la carpeta raíz.

Protección con contraseña mediante .htpasswd

Esto es útil cuando se quiere agregar una contraseña a ciertas páginas y/o archivos

 Crea un archivo .htpasswd en la carpeta a protejer.


 El archivo contendrá la información de registro de la forma
usuario:contraseña. El nombre de usuario es en texto plano. La contraseña
debe de estar encriptada o no funcionará. Utiliza esta herramienta para saber
qué texto agregar.
 Si se crea el archivo en la PC local, acuérdate de subirlo al servidor en modo
ASCII.
 Normalmente, se puede modificar el archivo .htaccess. La autenticación se
aplicará a la carpeta en la que se encuentre y las subcarpetas.

AuthUserFile /home/pathto/.htpasswd
AuthType Basic
AuthName "Mi Carpeta Secreta"

require valid-user

Se puede protejer un sólo archivo incluyendo este código dentro de una


directiva
 Asegúrate de protejer el acceso al archivo .htaccess utilizando el primer
consejo.

Activando SSI

Utiliza éstas instrucciones para activar la interpretación SSI

AddType text/html .html


AddType text/html .shtml
AddHandler server-parsed .html
AddHandler server-parsed .shtml

Cambiando la página por defecto

Se puede utilizar esta instrucción para cambiar la página por defecto (el orden es
importante)

DirectoryIndex inicio.html index.htm index.html index.php

Volver al índice

Evitando el error 500

Pasando el juego de caracteres se evita el mostrar un error 500

AddDefaultCharset utf-8

Volver al índice

Directiva CheckSpelling [Control de Ortografía]

Esta directiva puede ser útil para auto-corregir errores de ortografía simple en la URL

CheckSpelling On

Volver al índice

Agregar sumario MD5

Si no se está preocupado por problemas de performance, se peude agregar un cálculo de


llave MD5 para agregar un MIC [Control de Integridad de Mensaje en inglés] en cada
pedido. Esto es útil para controlar la integridad del mensaje.

ContentDigest On

Volver al índice
Fuentes

 http://corz.org/serv/tricks/htaccess.php
 http://underscorebleach.net/jotsheet/2004/06/htaccess-prevent-
hotlinking
 http://brainstormsandraves.com/archives/2005/10/09/htaccess/
 http://www.usphp.com/security.hiding.html

Volver al índice

Herramientas

 Generador de contraseñas .htaccess

You might also like