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.
¡Gracias!
Un buen resumen.
¿Se podría complementar con una explicación de las RegExp? (un día que estés con mucho tiempo 🙂 ).
Saludos.