Las reglas htaccess que debes conocer

Las reglas htaccess que debes conocer.

El .htaccess es un archivo de configuración que se utiliza en servidores web que ejecutan Apache Web Server. Al crear un archivo .htaccess en el directorio de un sitio web, Apache lo detecta y ejecuta las reglas contenidas en el mismo.

Este archivo nos permite alterar la configuración original de Apache Web Server. Sus funciones son variadas, por ejemplo habilitar o deshabilitar funciones, características adicionales como la compresión o el bloqueo de direcciones, y un largo etcétera. Una de sus funciones más utilizadas es la redirección, muy útil en temas de SEO, o para evitar los típicos errores 404 archivo no encontrado.

En este completo articulo revisamos las reglas htaccess más utilizadas.

 

Las reglas htaccess que debes conocer

Bloquear y permitir acceso

Para denegar el acceso a todas las ip.

#denegar todo acceso
deny from all

Permitir el acceso sólo a una IP

#denegar todo acceso excepto una IP
deny from all
allow from 100.100.100.100

Denegar el acceso a un rango de ip.

#denegar todo acceso excepto a un rango de IP
allow from all
deny from 100.100.100.100/24

Permitir el acceso a un rango específico.
#permitir todo acceso excepto a un rango de IP
allow from all
deny from 100.100.100.100/24

Bloquear el acceso a un archivo específico.
#bloquear un fichero concreto
<Files archivosecreto.txt>
Order allow,deny
Deny from all
</Files>

Redireccionar las visitas a otra url, menos al cliente de una IP específica.

#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 acceso a un dominio o subdominio en concreto.

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

Denegar acceso a visitas que provengan de uno o varios dominios.

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

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

Denegar acceso en varias horas.

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

Denegar acceso de proxy (puedes agregar los que quieras).

# bloqueo de Proxy
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]

Denegar el acceso a .htaccess.

# denegar acceso .htaccess
<files .htaccess>
order allow,deny
deny from all
</files>

Denegar el acceso a varios tipos de archivo.
# 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

Denegar el listado de directorios

# evitar listado de directorios
IndexIgnore *

Evitar el hotlinking. El hotlinking es la practica de enlazar ficheros desde tu servidor para que se muestren en otro sitio web. Ejemplo de imágenes.

# Evita el hotlinking a ficheros GIF y JPG del servidor
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?midominio\.com/.*$ [NC]
RewriteRule .*\.(gif|jpg)$  [R,NC,L]

Evitar el hotlinking. El hotlinking es la practica de enlazar ficheros desde tu servidor para que se muestren en otro sitio web. En el ejemplo archivos multimedia MP3, 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)$  [R,NC,L]

Bloqueo de robot -bot- específico, a través de SetEnvIfNoCase

# bloqueo del bot BotMalo
SetEnvIfNoCase User-Agent "BotMalo/" spambot
deny from env=spambot

Bloquear robot -bot- específico, a través de Rewrite.

# bloqueo de 3 bots conocidos (hay muchísimos más)
RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus
RewriteRule .* - [F]

Bloquear robot -bot- que accede siempre al mismo fichero.

# bloqueo del bot al acceder a un fichero PHP concreto
SetEnvIfNoCase Request_URI "/sololinux.php$" spambot
deny from env=spambot

Bloquear robot -bot- que siempre viene referenciado desde un mismo sitio con SetEnvIfNoCase.

# bloqueo cuando se viene referenciado de un sitio web concreto
SetEnvIfNoCase Referer "^http://dominiospam.com/" spambot
deny from env=spambot

Nota: Las tres reglas de Apache anteriores las podemos combinar de la siguiente forma.

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

Bloquear robot -bot- que siempre viene referenciado desde un mismo sitio con Rewrite.

# Bloquear robot que viene de ejemplo1.com
RewriteCond %{HTTP_REFERER} ^ejemplo1\.com$ [NC]
RewriteRule .* - [F]

Bloquear acceso al indice del directorio.

# evitar acceso a carpeta sin index
Options All -Indexes

Permitir navegar por directorios.

# evitar acceso a carpeta
Options All +Indexes

 

Reescritura y redirección

Quitar www de la dirección. Es una practica necesaria para evitar url’s duplicadas.

# Quitar el www del nombre de dominio  
RewriteCond %{HTTP_HOST} ^www\.midominio\.com$ [NC]  
RewriteRule ^(.*)$ https://midominio.com/$1 [R=301,QSA,L]

Mostrar www en la dirección. Es una practica necesaria para evitar url’s duplicadas.
# Redirigir el dominio sin www a www  
RewriteCond %{HTTP_HOST} ^midominio\.com$ [NC]  
RewriteRule ^(.*)$ https://www.midominio.com/$1 [R=301,QSA,L]

Indicar la página principal por defecto. Es importante el orden, pues las busca por orden.
#orden de los ficheros de inicio por defecto
DirectoryIndex inicio.html index.htm index.html index.php

Redirigir el contenido dependiendo del navegador del usuario.

#Redirigir el contenido en función 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]

Redireccionar con ReDirect de manera permanente.

# redireccionar permanentemente
redirect 301 / https://www.dominio.com/

Redireccionar una web a otro sitio de forma provisional (redirección 302).

# redireccionar provisionalmente
RewriteRule ^(.*)$ https://www.minuevodominio.com/$1 [R=302,L]

Redireccionar una pagina a otra.

# redireccionar un antiguo fichero a otra nueva dirección
Redirect /pagina1.html https://dominio.com/pagina2.html

Redireccionar una IP concreta a una página especifica. Útil para spamers o atacantes que tengas identificados.

# redireccionar una IP a una página concreta de nuestra web
RewriteCond %{REMOTE_ADDR} 100.101.102.103
RewriteRule .* paginabasura.html [R]

Redireccionar un sitio 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 cadena de la url.

# quitar una cadena de una URL
RewriteRule ^quitar/(.+)$  [R=301,L]

URL amigable de forma permanente.

# Uso de ?
RewriteCond %{REQUEST_URI} ^/articulos-blog$ [NC]
RewriteCond %{QUERY_STRING} ^catid=(.*)$ [NC]
RewriteRule ^(.*)$ /articulos-blog? [R=301,L]

URL amigable, ejemplo: 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]

Cambia una URL con la cadena «ps» por una URL con la cadena «posicionamiento-seo» que determina mejor el contenido de la pagina.

# sustituyendo caracteres por otros que determinan el contenido
RewriteRule ^(.*)/ps/(.*)$ $1/posicionamiento-seo/$2 [L,R=301]

Transformar una URL con agrupamiento de caracteres (mayúsculas y minúsculas), y la modifica.

# detectar palabras en mayúsculas, minúsculas o combinadas
RewriteRule ^pais/([a-zA-Z_-]+).php$ codigo/pais.php?nombre=$1 [L]

 

Comprime y cachea con htaccess

Comprimir archivos de texto, HTML, JavaScript, CSS, XML, etc.

# 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

Igual que lo anterior pero en una sola línea.

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

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

Cachear con ExpiresByType en intervalos diferentes.
#caché que expira las imágenes 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 durante un año con ExpiresDefault y el intervalo en segundos.

ExpiresActive On
ExpiresDefault A0
#  caché expira en un año (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>

 

Otras reglas de htaccess

Proteger el archivo .htpasswd.

chmod .htpasswd files 640

Proteger el archivo .htaccess.

chmod .htaccess files 644

Asignar permisos CHMOD a todos los ficheros PHP

# permisos de archivos PHP
chmod php files 600

Limitar la subida de archivos con un tamaño superior al definido.

# limitar la subida a 10 MB
LimitRequestBody 10000000

Permitir al usuario descargar archivos multimedia Generalmente sólo 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 la pagina de error 404.

ErrorDocument 404 /errores/404.html

Nota: Para otros errores es similar, se coloca el número de error y la dirección donde queremos redireccionar al usuario.

Corrección de pequeños errores de ortografía en las url. Ten cuidado con esta directiva, puede dar problemas como por ejemplo convertir status.html a state.html.

CheckSpelling On

Especificar el e-mail 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 es-ES

Forzar el uso del protocolo seguro SSL.

# fuerza el uso de SSL en la web
SSLOptions + StrictRequire
SSLRequireSSL

Redireccionar usuarios con protocolo HTTPS a una carpeta en particular. Esto se puede necesitar cuando una web tiene una tienda online https en una carpeta específica. Esta directiva ya no se utiliza, se recomienda https, pero aun así puede que lo necesites en redes locales.

RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} carpeta
RewriteRule ^(.*)$  [R,L]

Evitar que los usuarios vean las indicaciones de error.

# 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 los 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 número de visitas a la vez a 25.

# limitar el número de visitas a 25
MaxClients 25

Prohibir que se ejecuten scripts CGI.

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

Declarar los tipos MIME.

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

Definir el juego de caracteres a UTF-8.

AddDefaultCharset utf-8

Desactivar las ETags. Son etiquetas que se asignan a cada archivo para compararlas con la Etag que tiene en caché el navegador del usuario. Si coinciden, el archivo no se descarga y toma el del navegador.

FileETag none

 

Códigos y símbolos del .htaccess

De forma breve, los códigos y símbolos del archivo .htaccess:

# Con la almohadilla se ignora la orden.

[F] Forbidden: prohíbe y fuerza un acceso denegado. 403 Forbidden.

[L] Last rule: indica que es la última regla que debe aplicarse.

[N] Next: indica continuación 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 redirección. Puede haber de varios tipos 301 (permanente), 302 (provisional).

[NC] No Case: no sensible a mayúsculas, es decir, indica que no debe distinguirse entre mayúsculas y minúsculas.

[PT] Pass Through: pasa el URL a Apache para seguir procesando.

[OR] Or: indica que la expresión debe interpretase como una alternativa junto a la siguiente: ó lógico. Si se omite, se sobreentiende que es una y lógica, 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 expresión (URL).

[S=x] Skip: salta las siguientes "x" reglas del fichero .htaccess.

[E=variable:value] Environmental Variable: para añadir un valor a una variable.

[T=MIME-type] Mime Type: declara mime-type al recurso.

[] dentro de los paréntesis se encierran carácteres que definen los resultados.

[]+ se utiliza para hacer combinaciones.

[^] excluye los carácteres que pongamos dentro del paréntesis. Ejemplo [^abc] excluye las letras a, b y c.

[a-z] letras desde la a hasta la z (en minúsculas).

[A-Z] letras desde la A hasta la Z (en mayúsculas).

[a-zA-Z] sólo letras (mayúsculas y minúsculas).

[a-z]{1,10} palabras en minúsculas entre 1 y 10 caracteres.

[0-9] sólo un número.

[0-9]{4} números de 4 cifras.

(.*) cualquier expresión, incluida la vacía.

a{n} especifica el número de caracteres.

a{n,} especifica el número "o más" 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 símbolo al final del segundo argumento del RewriteRule, indicará que no se ponga nada más en la URL.

! es la negación. Ejemplo: "!string" resulta "no string".

. indica cualquier caracter arbitrario.

- instrucción “not to”.

+ indica uno o más caracteres del caracter que le precede. Por ejemplo: (.+) indica cualquier cadena de uno o más caracteres.

| es el ó lógico, condición 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 indicaría cualquier caracter.

/* indica cero o más "/".

.* indica cualquier caracter, incluido que no exista caracter.

^$ indica una cadena vacía.

^.*$ indica "todo", toda la cadena.

[^/.] define un caracter que no sea "/" ni ".".

[^/.]+ define, ningún número de caracter que tenga "/" o ".".

https:// es literalmente “https://”.

^dominio.* define una cadena que comience con "dominio" y le siga cualquier número de caracteres.

^dominio\.com$ define “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.

 

Recomendaciones sobre el fichero y las reglas htaccess

El tamaño es importante: cuanto menos bytes tenga el fichero .htaccess, menos tiempo tardará el servidor en procesarlo. Si tu archivo tiene un tamaño excesivo, el rendimiento se puede ver afectado de manera considerable. Debemos tener presente que cada petición recibida por el servidor, se lee el archivo htaccess.

Las denegaciones deben estar al comienzo del archivo, antes de ejecutar RewriteCond y RewriteRule. La directiva L es imprescindible, hace que el servidor no procese más el archivo una vez que se cumple esa regla, siempre que puedas implementa esta directiva en los RewriteRule.

La organización es fundamental: te recomiendo que comentes adecuadamente para que las modificaciones posteriores seas rápidas y sencillas. Organiza adecuadamente las instrucciones, y protege el archivo de reescrituras ajenas.

 

Espero que este articulo te sea de utilidad, puedes ayudarnos a mantener el servidor con una donación (paypal), o también colaborar con el simple gesto de compartir nuestros artículos en tu sitio web, blog, foro o redes sociales. Alternativas a AutoCAD.

 

Una respuesta

  1. Henry
    07/11/2019

Agregar comentario