Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Próxima revisión
Revisión previa
htaccess_en_profundidad [2015/02/23 11:38]
10.12.12.54 creado
htaccess_en_profundidad [2017/03/27 17:44] (actual)
Línea 1: Línea 1:
 [[http://​www.netandsoftware.es/​articulos-blog/​articulos-del-blog/​art-para-webmasters-y-joomla/​505-htaccess-en-profundidad-la-guia-completa]] [[http://​www.netandsoftware.es/​articulos-blog/​articulos-del-blog/​art-para-webmasters-y-joomla/​505-htaccess-en-profundidad-la-guia-completa]]
 +
 +
 +
 +
 +
 +
 +
 +====== 1.- Introducción ======
 +
 +
 +Hay muchísimos artículos 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 configuración de Apache. Apache es el software encargado de servir páginas 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 genéricos 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 del servidor
 +
 +Crear un fichero .htaccess dentro de la carpeta con las instrucciones:​
 +
 +  #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
 + 
 +Permitir el acceso sólo a un rango específico de IPs (forzado mediante la máscara 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 específico
 +
 +  #bloquear un fichero concreto
 +  <Files archivo_a_bloquear.html>​
 +    order allow,deny
 +    deny from all
 + 
 +Redireccionar visitantes a una dirección alternativa,​ menos a 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 un rango completo de IP
 +
 +Esto quiere decir que elimina 256 direcciones en el primer caso, 65536 en el segundo caso, y más 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 más 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 específica
 +
 +  # 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 específico
 +
 +  #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 más eficaz, si el archivo que mostramos a aquellos que realizan el hotlinking lo colgamos en un servidor gratuito de imágenes tipo ImageShack.us (o similares) y lo referenciamos allí.
 + 
 +Bloqueo de ficheros determinados el cualquier subdominio, para evitar hotlinking específico
 +
 +Para evitar el hotlinking a ficheros MP3 y ficheros de vídeo 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 envían ficheros por RSS -sindicación del sitio- debe tenerse en cuenta, ya que las instrucciones anteriores bloquean todo el contenido de vídeo y los RSS pueden verse mal.
 +
 + 
 +
 +Nota: Es más eficaz, si el archivo que mostramos a aquellos que realizan el hotlinking lo colgamos en un servidor gratuito de imágenes tipo ImageShack.us o similar, y lo referenciamos allí.
 + 
 +Bloqueo de robot -bot- específico,​ a través de SetEnvIfNoCase
 +
 +  # bloqueo del bot BotMalo
 +  SetEnvIfNoCase User-Agent "​BotMalo/"​ spambot
 +  deny from env=spambot
 + 
 +Bloque de 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]
 + 
 +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 través 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 líneas 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 través 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 través 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 redirección ======
 +
 +
 + 
 +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 página 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 más dificil detectar el tipo de ficheros que se usa
 +
 +  # camuflar archivos PHP como NAS
 +  AddType application/​x-httpd-php .nas
 + 
 +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]
 +
 + 
 +
 +Nota: Los asteriscos indican el uso de cualquier versión de ese navegador, por ejemplo:​dicarse a continuación de la barra, como "​Mozilla/​3.0",​ "​Mozilla/​4.0",​ "​Mozilla/​5.0",​ etc.
 + 
 +Redireccionar una antigua página a la nueva
 +
 +  # redireccionar permanentemente
 +  RewriteRule ^(.*)$ http://​www.minuevodominio.com/​$1 [R=301,L]
 + 
 +Redireccionar una antigua página a la nueva, a través de ReDirect
 +
 +  # redireccionar permanentemente
 +  redirect 301 / http://​www.dominio.com/​
 + 
 +Redireccionar una web a otro sitio provisionalmente (redirección 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 dirección
 +  Redirect /​antiguo.html http://​dominio.com/​nuevo.html
 + 
 +Redireccionar una IP concreta a una página concreta
 +
 +Puede servir para avisar a una persona con una IP concreta de que ha sido baneada.
 +
 +# redireccionar una IP a una página 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 interrogación 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]
 + 
 +Transformación de una URL con agrupamiento de caracteres mayúsculas y minúsculas
 +
 +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 mayúsculas o minúsculas o combinacion de ambas
 +  RewriteRule ^pais/​([a-zA-Z_-]+).php$ codigo/​pais.php?​nombre=$1 [L]
 + 
 +Paso de parámetros en la URL y doble parámetro
 +
 +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 parámetro
 +  RewriteRule ^fecha/​(.+)/​(.+)\.html$ fecha.php?​mes=$2&​anio=$1 [R=301,L]
 +
 + 
 +
 + 
 +
 + 
 +====== 4.- Compresión 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
 +
 + 
 +
 +También en una sóla 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 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, imágenes 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 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 a 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>​
 +
 + 
 +
 + 
 +
 + 
 +====== 5.- Otros funcionalidades en el .htaccess ======
 +
 + 
 +Asignar permisos CHMOD automáticamente al fichero .htpasswd
 +
 +  # permiso automático del fichero que protege el directorio .htpasswd
 +  chmod .htpasswd files 640
 + 
 +Asignar permisos CHMOD automáticamente al fichero .htaccess
 +
 +  # permiso automático del fichero .htaccess
 +  chmod .htaccess files 644
 + 
 +Asignar permisos CHMOD automáticamente a ficheros PHP
 +
 +  # permisos automáticos de archivos PHP
 +  chmod php files 600
 + 
 +Limitar la subida de ficheros más grandes que una cantidad
 +
 +Protege de ciertos ataques DOS, limitando el tamaño de archivos que se suben al servidor.
 +
 +  # 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 errores 404
 +
 +  ErrorDocument 404 /​errores/​404.html
 +
 + 
 +
 +Nota: Para otros tipos de errores es similar, se coloca el número de error y la dirección donde queremos redireccionar al visitante.
 + 
 +Corregir pequeños errores de ortografía 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 específica
 +
 +  RewriteCond %{SERVER_PORT} 80
 +  RewriteCond %{REQUEST_URI} carpeta
 +  RewriteRule ^(.*)$ https://​www.midominio.com/​carpeta/​$1 [R,L]
 + 
 +Evitar la visualización 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 número de visitas al mismo tiempo a 400
 +
 +  # limitar el número de visitas a 400
 +  MaxClients 400
 + 
 +Denegar la ejecución 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 ======
 +
 +
 +El tamaño es importante: cuanto más pequeño sea el fichero .htaccess menos tiempo tardará el servidor en procesarlo cada vez que se realiza una petición a tu servidor. Esto implica una pérdida de rendimiento en la carga de las páginas de tu sitio web si este fichero se hace demasiado grande.
 +    ​
 +La directiva [L] es realmente interesante y hace que el servidor no procese más el archivo una vez que se cumple esa regla. Por lo que incorpora siempre que puedas esta directiva en los RewriteRule.
 +La organización es fundamental:​ dado lo complicada que pueden ser ciertas líneas en el código de .htaccess, es imprescindible comentar adecuadamente tu fichero para que la modificación sea rápida y sencilla. No escatimes en comentarios,​ y organiza adecuadamente las instrucciones de tu .htaccess.
 +Protege adecuadamente este archivo de reescrituras ajenas, puede llegar a ser muy peligroso.
 +
 +La denegación de permisos debe estar lo primero, antes de ejecutar RewriteCond y RewriteRule.
 +
 + 
 +
 + 
 +====== 7.- Simbología del fichero .htaccess ======
 +
 +
 +De forma breve, los códigos y símbolos en el archivo .htaccess son:
 +
 +# Puesto al inicio de una línea, ignora esa línea.
 +
 +[F] Forbidden: prohíbe un acceso 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: o 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 "​."​.
 +
 +http:// es literalmente “http://​”.
 +
 +^dominio.* define una cadena que comience con "​dominio"​ y le siga cualquier número 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.
 +
 + 
 +
 +