.htaccess es un archivo de configuración de Apache, que nos permite establecer reglas en un directorio. De él puede depender una buena parte del rendimiento de nuestras páginas web.

En este artículo os voy a enseñar mis líneas de .htaccess básicas para cualquier página web.

Nota inicial

.htaccess se evalúa cada solicitud, añadiendo carga al servidor. Por eso, siempre que sea posible, en producción modifica el archivo httpd.conf directamente.

Desgraciadamente, esto no es posible para la inmensa mayoría de los mortales (entre los que me incluyo).

Finalmente indicar que buena parte de estas líneas de código vienen gracias a html5 Boilerplate. Creo que recopilarlos aquí y hacerlos accesibles a todos puede ser una buena idea.

Redirección del domino

Hay dos opciones: Que quieras redirigir el dominio con www a sin www (de www.midominio.com a midominio.com) o viceversa. Mantener ambos puede llevar problemas de SEO, o acceso a archivos.

De con www a sin www

Tened en cuenta que hace falta activar RewriteEngine para que ambos funcionen con la línea RewriteEngine On si no está activado por defecto
# Eliminar www.
<IfModule mod_rewrite.c>
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
</IfModule>

De sin www a con www

<IfModule mod_rewrite.c>
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
  RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

Caché de archivos

La caché de archivos puede ser inmensamente beneficiosa para la velocidad de una web. Básicamente: Si un usuario visita cinco páginas de nuestra web, no tiene por qué descargar los mismos archivos estáticos (como imágenes, css y javascript) cinco veces. El navegador puede almacenar esos archivos en el sistema para obtenerlos mucho más rápidamente, pero para ello necesita instrucciones del servidor.

<IfModule mod_expires.c>
  ExpiresActive on

  # Por defecto 1 mes de caché
  ExpiresDefault                          "access plus 1 month"

  # los manifiestos appcache necesitan solicitarse cada vez, por firefox 3.6 (probablemente no necesario actualmente?
  ExpiresByType text/cache-manifest       "access plus 0 seconds"

  # El HTML nunca debe de ser cacheado
  ExpiresByType text/html                 "access plus 0 seconds"

  # Los datos dinámicos tampoco (tal vez podría variar dependiendo de tu aplicación)
  ExpiresByType text/xml                  "access plus 0 seconds"
  ExpiresByType application/xml           "access plus 0 seconds"
  ExpiresByType application/json          "access plus 0 seconds"

  # Una hora para los feeds (cambiar dependiendo de la fecha de actualización de tu web)
  ExpiresByType application/rss+xml       "access plus 1 hour"
  ExpiresByType application/atom+xml      "access plus 1 hour"

  # Favicon (Sólo una semana porque el nombre no cambia, luego podría haber cambios y mantenerse el cacheado)
  ExpiresByType image/x-icon              "access plus 1 week"

  # Imágenes, vídeo, audio: 1 mes
  ExpiresByType image/gif                 "access plus 1 month"
  ExpiresByType image/png                 "access plus 1 month"
  ExpiresByType image/jpeg                "access plus 1 month"
  ExpiresByType video/ogg                 "access plus 1 month"
  ExpiresByType audio/ogg                 "access plus 1 month"
  ExpiresByType video/mp4                 "access plus 1 month"
  ExpiresByType video/webm                "access plus 1 month"

  # Fuentes web: 1 mes
  ExpiresByType application/x-font-ttf    "access plus 1 month"
  ExpiresByType font/opentype             "access plus 1 month"
  ExpiresByType application/x-font-woff   "access plus 1 month"
  ExpiresByType image/svg+xml             "access plus 1 month"
  ExpiresByType application/vnd.ms-fontobject "access plus 1 month"

  # CSS y JavaScript: 1 año. Ten en cuenta que si cambias los ficheros deberías usar una query string o un nombre de archivo diferente para evitar que los visitantes reciban archivos cacheados.
  ExpiresByType text/css                  "access plus 1 year"
  ExpiresByType application/javascript    "access plus 1 year"

</IfModule>

# Eliminar E-Tag
# Estamos enviando periodos de caché muy amplios, así que no es necesario que el navegador compruebe mediante E-Tag si el fichero cambió
<IfModule mod_headers.c>
  Header unset ETag
</IfModule>
FileETag None

Compresión GZIP

GZIP es la manera más rápida de reducir el tamaño del archivo enviado al navegador, mejorando el tiempo de carga. Con las siguientes líneas la activarás en tu web:


<IfModule mod_deflate.c>
    # Force compression for mangled headers.
    # http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping
    <IfModule mod_setenvif.c>
        <IfModule mod_headers.c>
            SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
            RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
        </IfModule>
    </IfModule>

    <IfModule mod_filter.c>
        AddOutputFilterByType DEFLATE application/atom+xml \
                                      application/javascript \
                                      application/json \
                                      application/rss+xml \
                                      application/vnd.ms-fontobject \
                                      application/x-font-ttf \
                                      application/x-web-app-manifest+json \
                                      application/xhtml+xml \
                                      application/xml \
                                      font/opentype \
                                      image/svg+xml \
                                      image/x-icon \
                                      text/css \
                                      text/html \
                                      text/plain \
                                      text/x-component \
                                      text/xml
    </IfModule>

</IfModule>

Codificación UTF-8

Si alguna vez habéis tenido problemas con caracteres extraños en vuestro servidor, puede ser por dos cosas: La base de datos o el propio servidor, si es por lo segundo, con las siguientes líneas debería de estar solucionado:

AddDefaultCharset utf-8
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml

Forzar IE a no emularse

Puede que la conozcáis o no, pero hay una pequeña cabecera usada por IE llamada X-UA-Compatible, que puede hacer que IE9 se comporte como si fuera IE7 (por ejemplo). Esto causa bastantes problemas, porque además de usar un navegador menos compilante con los estándares, crea inconsistencias entre versiones, para asegurarse de que IE10 actúa como IE10, IE9 como IE9, etc… y que IE6/7/8 usen Chrome Frame si está instalado:

# Eliminar www.
<IfModule mod_headers.c>
    Header set X-UA-Compatible "IE=edge,chrome=1"
    # Sólo queremos añadirlo para páginas HTML, el resto es un desperdicio de ancho de banda
    <FilesMatch "\.(appcache|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svg|svgz|ttf|vcf|webapp|webm|webp|woff|xml|xpi)$">
        Header unset X-UA-Compatible
    </FilesMatch>
</IfModule>

¿Alguna línea de código más?

Soy todo oídos si tienes algo que aportar :)

80 pensamientos en “Creando el .htaccess perfecto

  1. Bitacoras.com
  2. Imagen de agamezcm el dijo:

    Amigo Emilio un placer conectar contigo. Me metí de lleno en wordpress con otro blog (ayudando a un amigo). El blog es campingeltorcal.com. Es la primera vez que estoy trabajando con un hosting y la primerísima que he tocado un “.htaccess” y al parecer es la única forma para solucionar un problema que no tenía ni idea que existía en wordpress y es el de la personalización de URL. Como sabes si elige una personalización diferente a la predeterminada, como no modifiques el .htacces no puedes acceder a las distintas entradas y páginas del blog. Así es que acabo de estrenar el archivo .haccess con las siguientes líneas:
    # BEGIN WordPress

    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ – [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]

    # END WordPress
    y funciona perfectamente. Después he vuelto a leer tu post, porque la primera vez que lo ví no tenia ni idea de que iba el tema, ahora ya tengo la base.
    Te he incluido éste comentario por si a alguno de tus lectores le viene bien.
    Saludos amigo. Espero que estés bien.

    • Imagen de Emilio Cobos Álvarez el dijo:

      Sí, en el apartado de “Opciones > Preferencias para motores de búsqueda > Errores y Redireccionamientos” tienes que añadir un redireccionamiento poniendo como primer elemento “/” (sin las comillas) y como segundo “/p/inicio.html” (o la página a redirigir).

      Saludos :)

  3. Forzar IE a no emularse - vissit.com [diseño web]
  4. Imagen de Juan GutierrezJuan Gutierrez el dijo:

    Trate de Comunicarme contigo en la Sección de Contacto, y siempre me dice “Debo de colocar Nombre un Mail válido y el Mensaje” Cosa que ya había hecho…

    “Hace poco te pedí ayuda con el de las encuesta y un problema que me genero el querer cambiar la clave, lo que te pregunto ahora es, Puedes ayudarme a crear Reportes en PDF, usando Gráficas que no sean (http://jpgraph.net/) yo estoy usando la librería de: http://www.highcharts.com/ que me parecen muy buenas pero necesito llevar todo eso a un PDF, podrías ayudarme?”

    • Imagen de Emilio Cobos Álvarez el dijo:

      Cierto, lo del contacto está solucionado :P Era un pequeño error en el servidor, que siempre retornaba error.

      Sobre lo del pdf, puedes probar a ejecutar del lado del servidor wkhtmltopdf, guardando en algún archivo temporal el svg. No obstante, ten encuenta que en adobe reader no estarán los efectos que highcharts usa, ya que los añade via javascript. Sólo estará la gráfica. Si necesitas que sea desde el cliente, puedes tratar de usar jsPDF, pero por lo visto sólo soporta HTML, no SVG…

  5. Imagen de Juan GutierrezJuan Gutierrez el dijo:

    Podemos hablar en otro medio? facebook? Twitter? y bueno se lo de los efectos eso me queda claro, pero use highchart es por las amplias opciones que me permite hacer… es decir los datos el modo en que grafico y todas las demas caracteristicas… no entendi bien que es SVG.. y estoy hecho un lio con esto =S

  6. Imagen de OmarOmar el dijo:

    Hola Emilio. Muy bueno tu blog, felicitaciones!

    Sólo un detalle, utilicé el código de la sección “De sin www a con www“, pero no me funcionó. Luego, observándolo detenidamente, noté que falta la directiva RewriteEngine on, la añadí y funcionó perfecto. El código quedaría así:

    <IfModule mod_rewrite.c>
         RewriteEngine on
         RewriteCond %{HTTPS} !=on
         RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
         RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    </IfModule>

    La verdad es primera vez que utilizo el .htaccess, y como noto que tampoco lo usas para escribir otras reglas, no sé si realmente es necesario hacer este cambio o si soy yo el que está haciendo algo incorrecto. Espero tu comentario.

    Un abrazo y nuevamente felicitaciones.

  7. Imagen de David LázaroDavid Lázaro el dijo:

    Hola Emilio,
    Primero, muchas gracias por compartir conocimiento.

    Y quisiera saber si puedes ayudarme, o si lo que pido es posible. Quisiera que mi blog, que tiene la estructura [www.dominio.com/blog/post.php] se viera como [www.dominio/blog] , es decir ocultar completamente el fichero de script.
    He conseguido que se viera sin la extensión php, pero quisiera además ocultar su nombre.

    Muchas gracias.
    Un saludo

  8. Imagen de David LázaroDavid Lázaro el dijo:

    Vaya rapidez en contestar!!! :)

    La plataforma es Linux. La url, si no te importa, no la pongo…
    Si es complejo, me gusta investigar, dame un par de directrices que lo intentaré por mi cuenta.

    Muchas gracias

    • Imagen de Emilio Cobos Álvarez el dijo:

      Me has pillado con gmail abierto :P

      Con plataforma me refería a CMS. En principio para lo que dices haría falta algo de este estilo (esto iría en la carpeta blog):

      <IfModule mod_rewrite.c>
      	RewriteEngine on
      
      	RewriteCond %{REQUEST_FILENAME} !-f
      	RewriteCond %{REQUEST_FILENAME} !-d
      
      	RewriteRule ^(.+)$ post.php/$1 [L]
      </IfModule>

      Eso redirigiría todas las solicitudes que fueran a /blog/cualquiercosa a post.php/cualquiercosa, pero dependiendo de qué cms sea habrá que cambiar los links, y hacer diversas modificaciones (al .htaccess o al cms, lo que sea más fácil).

      • Imagen de David LázaroDavid Lázaro el dijo:

        Muchas gracias Emilio,

        Te he contestado antes, pero veo que no está el comentario, con lo que habré hecho algo mal…

        También te comentaba que no utilizo ningún CMS, sino que es un blog hecho desde 0.

        Ahora ya lo he probado y no me funciona. Cuando pongo http://www.dominio.com/blog lo interpreta como que quiero acceder al listado del directorio. Tampoco si le pongo una solicitud de parámetros GET para acceder a un post determinado… Me parece que lo voy a dejar como está, llevo ya demasiados días con esto…

        De todas formas, muchas gracias por tu ayuda!!!

        Un saludo.

  9. Imagen de Juan GutierrezJuan Gutierrez el dijo:

    Creo que lo que David quiere es que cuando alguien intente acceder a cualquier archivo.php que se encuentre en la carpeta BLOG no muestre dicho archivo si no la carpeta de la raiz…

    eso aplicaria solo a los archivos.php (no incluyen html) es lo que yo pienso…

  10. Imagen de PabloPablo el dijo:

    Hola. Actualicé mi sito a Joomla 2.5 y puse las URL amigables y todo. Tengo el componento MijoSEF que anda perfecto. El problema es que mi dirección de inicio es http://www.midominio.com pero esa página aparece en blanco y simpre tengo que entrar como http://www.midominio.com/index.php. Tengo el archivo .htaccess y todo pero no veo la forma de que quitar el index.php que solo se hace necesario en la página de inicio. No sé si tengo un buen archivo .htaccess, así que lo pego aquí para ver si me pueden ayudar con este problema:

    # AddHandler x-httpd-php5 .php
    # AddHandler x-httpd-php5-4 .php
    AddHandler x-httpd-php5-3 .php
    ##
    # @version $Id: htaccess.txt 21064 2011-04-03 22:12:19Z dextercowley $
    # @package Joomla
    # @copyright Copyright (C) 2005 – 2010 Open Source Matters. All rights reserved.
    # @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
    # Joomla! is Free Software
    ##

    #####################################################
    # READ THIS COMPLETELY IF YOU CHOOSE TO USE THIS FILE
    #
    # The line just below this section: ‘Options +FollowSymLinks’ may cause problems
    # with some server configurations. It is required for use of mod_rewrite, but may already
    # be set by your server administrator in a way that dissallows changing it in
    # your .htaccess file. If using it causes your server to error out, comment it out (add # to
    # beginning of line), reload your site in your browser and test your sef url’s. If they work,
    # it has been set by your server administrator and you do not need it set here.
    #
    #####################################################

    ## Can be commented out if causes errors, see notes above.
    Options +FollowSymLinks

    #
    # mod_rewrite in use

    RewriteEngine On

    ########## Begin – Rewrite rules to block out some common exploits
    ## If you experience problems on your site block out the operations listed below
    ## This attempts to block the most common type of exploit `attempts` to Joomla!
    #
    ## Deny access to extension xml files (uncomment out to activate)
    #
    #Order allow,deny
    #Deny from all
    #Satisfy all
    #
    ## End of deny access to extension xml files
    # Block out any script trying to set a mosConfig value through the URL
    RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR]
    # Block out any script trying to base64_encode data within the URL
    RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
    # Block out any script that includes a tag in URL
    RewriteCond %{QUERY_STRING} (|%3E) [NC,OR]
    # Block out any script trying to set a PHP GLOBALS variable via URL
    RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
    # Block out any script trying to modify a _REQUEST variable via URL
    RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
    # Return 403 Forbidden header and show the content of the root homepage
    RewriteRule .* index.php [F]
    #
    ########## End – Rewrite rules to block out some common exploits

    ########## Begin – Custom redirects
    #
    # If you need to redirect some pages, or set a canonical non-www to
    # www redirect (or vice versa), place that code here. Ensure those
    # redirects use the correct RewriteRule syntax and the [R=301,L] flags.
    #
    ########## End – Custom redirects

    # Uncomment following line if your webserver’s URL
    # is not directly related to physical file paths.
    # Update Your Joomla! Directory (just / for root)

    # RewriteBase /

    ########## Begin – Joomla! core SEF Section
    #
    RewriteRule .* – [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    #
    # If the requested path and file is not /index.php and the request
    # has not already been internally rewritten to the index.php script
    RewriteCond %{REQUEST_URI} !^/index\.php
    # and the request is for root, or for an extensionless URL, or the
    # requested URL ends with one of the listed extensions
    RewriteCond %{REQUEST_URI} (/[^.]*|\.(php|html?|feed|pdf|raw))$ [NC]
    # and the requested path and file doesn’t directly match a physical file
    RewriteCond %{REQUEST_FILENAME} !-f
    # and the requested path and file doesn’t directly match a physical folder
    RewriteCond %{REQUEST_FILENAME} !-d
    # internally rewrite the request to the index.php script
    RewriteRule .* index.php [L]
    #
    ########## End – Joomla! core SEF Section

    # and the requested path and file doesn’t directly match a physical file
    RewriteCond %{REQUEST_FILENAME} !-f
    # and the requested path and file doesn’t directly match a physical folder
    RewriteCond %{REQUEST_FILENAME} !-d
    # internally rewrite the request to the index.php script
    RewriteRule .* index.php [L]
    #
    ########## End – Joomla! core SEF Section

    • Imagen de Emilio Cobos Álvarez el dijo:

      Siento haber tardado tanto en contestar. Por alguna razón el comentario se quedó en moderación :( Y ahí se ha quedado hasta que lo he visto.

      El problema es la línea:

      RewriteCond %{REQUEST_URI} !^/index\.php

      , que sólo revisa la dirección /index.php

      Cambia !^/index\.php por !^/(index\.php)? y debería funcionar.

  11. Imagen de Roberto el dijo:

    Buenos días, tengo un pequeño problema sobre velocidad de página y si tengo wordpress el caso es que en wordpress hay dos htaccess uno está fuera de la plataforma de wordpress y el otro dentro, en qué archivo htaccess va los IfModule mod_expires.c ya que en gtmetrix no marca nada y tengo instalado los expire, ahora no sé si es porque está en home y no dentro de content, por favor me puedes explicar o decirme en cual de los dos va esto?

  12. Imagen de Daniel el dijo:

    Muchísimas gracias por este aporte, es increible encontrar páginas así, dónde viene todo organizado y perfectamente explicado.
    De verdad, mi enhorabuena por este aporte que nos sirve tanto a los que estamos empezando.
    Un saludo

  13. Imagen de Vicente el dijo:

    Emilio te faltan a implementar mucho texto para tener un .htaccess perfecto.
    Seguridad, protección comentarios span etc ¡¡o lo dejas tal cual!! hay que proteger el archivo config,el .htaccess y protección en caso de inyección SQL. ejemplo de mi archivo htaccess.
    Saludos

    • Imagen de Emilio Cobos Álvarez el dijo:

      El archivo .htaccess está protegido en el 99.99% (por no decir 100%) de los servidores web. Apache no te deja acceder a los dotfiles públicamente salvo que tú lo especifiques.

      La protección contra inyección SQL no deberías hacerla desde .htaccess, sino desde el programa que lea e inserte los datos.

      No se debería recargar tanto el .htaccess porque es un archivo que se evalúa una vez por cada solicitud.

      Los archivos de configuración varían dependiendo de la web, así que no se puede hacer una regla general…

  14. Imagen de AntonioAntonio el dijo:

    Hola! el caso es que yo tenía algunas de estas cosas (redirección, evitar duplicado con y sin http://www...) pero no uso la apertura con sino que escribo directamente las instrucciones.
    Es para un sitio html clásico, sin WordPress, ¿¿influye en algo que ponga la apertura IfModule o lo deje de poner??
    muchas gracias

  15. Imagen de Valentin el dijo:

    hola amigo, me podrias explicar como coloco el codigo de ExpiresActive on que tu dices en mi plantilla html? antes de que va ubicada? no tengo ni idea… muchisimas gracias :D

  16. Imagen de JulioJulio el dijo:

    Buenas noches, me doy cuenta que si sabes de redirecciones y por esto te pido si puedes ayudarme con algo que me está dando vueltas la cabeza. Me están saliendo títulos duplicados de esta forma: rsanahuano.com/la-moda-de-ser-inculto-y-vulgar/la-moda-de-ser-inculto-y-vulgar1-2/ que no tiene contenido dolo la imagen del post, como te darás cuenta en donde dice “vulgar1-2/” quiere decir que hay otra url con el número 1. Ahora la ruta correcta es http://rsanahuano.com/la-moda-de-ser-inculto-y-vulgar/ por esto google ya me sancionó hace como dos años y recién me estoy recuperando, tengo códigos que hacen redirecciones en .htacss pero no sé porque ya no funcionan incluso en funtion.php también tengo otro código que redireccionaba las url con imágenes como adjuntos pero también no sé porqué parece que no surte efecto. Me podrías decir cual de las que has expuesto más arriba me puede servir en este caso? Ya tengo como 230 URL de esta forma. Por favor.

  17. Imagen de AnaliaAnalia el dijo:

    Hola Emilio!

    Estoy desde ayer con mi web caida, he tocado el htaccess y ahora quiero volverlo de cero porque desde que lo hice tengo este problema

    Forbidden
    You don’t have permission to access / on this server.
    Additionally, a 403 Forbidden error was encountered while trying to use an ErrorDocument to handle the request.

    Estoy desesperada ya porque no encuentro mi error. Podrias ayudarme?
    Gracias!

  18. Imagen de YaneyYaney el dijo:

    Hola, he instalado por primera vez WordPress y cuando lo llamo me carga las plantillas pero sin imagenes, luego probé a instalar una nueva y lo mismo, carga las posiciones, todo bien menos las imagenes, todo plano, por llamarlo de algún modo, luego probé a crear una página nueva insertándole alguna imagen y esta si la muestra. Creo que todo está en la configuración del .htaccess pero no tengo ni idea de cómo hacerlo. Me podrías ayudar??
    gracias de antemano.
    saludos
    Yaney

  19. Imagen de alfonso el dijo:

    buen aporte, y bien haciendo referencia al archivo original, de donde he podido sacar alguna cosita mas
    lo único que no me queda claro es la opción

    # Options +Includes
    # AddOutputFilterByType INCLUDES text/css
    # SetOutputFilter INCLUDES
    #
    #
    ¿quiere de cir que puedo combinar los css mediante esta opcion?
    seria asi el modulo o hay que añadirle algo?

    gracias

  20. Imagen de Cathy el dijo:

    Hola Emilio. Se agradece mucho tu buena voluntad para responder. Mi consulta: page speeds me arroja puntos especificos que estan configurados como no cacheables y no los he podido modificar. Mi htaccess esta calcado al tuyo. Uno de ellos como referencia es el codigo de seguimiento de google analytics.
    Saludos y gracias por tus aportes.

    • Imagen de Emilio Cobos Álvarez el dijo:

      Me temo que no se puede hacer nada ante eso.
      Por lo que me cuentas, me estás hablando de scripts alojados en dominios externos, los propietarios de esos dominios suelen tener el control de la caché de esos recursos.

      Ese tipo de scripts (analytics, redes sociales…) no suelen ser un problema grande de rendimiento (hay tantos sitios usándolos que es muy probable que cuando el usuario llegue a tu sitio ya esté en la caché), y suelen tener un tiempo de caché bajo, probablemente para que los cambios que se hagan tarden poco en llegar.

      Un saludo, y si no hubiera entendido bien tu pregunta o cualquier cosa no dudes en volver a contestarme con lo que sea :P

  21. Imagen de davisondavison el dijo:

    Emilio… buenas tardes saludo desde colombia…. me gustaria saber cual es el problema sobre este error despues de que agregé en mi htaccess su codigo…. net::ERR_CONTENT_DECODING_FAILED…. son unos datos que me retorna el ajax con un dattype json…. y pues creo que es por algo del htaccess y no se que sera y lo borre pero sigue sin cargarme los datos… gracias

  22. Imagen de perfectwatchonline.com el dijo:

    Additionally, there are two metal bracelets offered, and those are usually 648 with no VAT (about $736). Whilst visually it may seem like you’d probably want it knocked a little more for the edge from the dial, they have place in a means that does not cut-off the indice found right now there, which is a great touch. Gumball 3000 was developed in 1999 simply by ex-racing motorist, designer plus British business owner Maximillion Cooper who a new vision to mix cars, songs, fashion plus entertainment to produce a lifestyle occasion that happens once each year. Well, gowns always the particular toughest query. The call of this Swarovski Lovely Deposits watches is definitely mother-of-pearl and it is surrounded simply by another band of deposits. Again, there is not inherently anything at all new, but instead a new taste – that is exactly how Panerai prefers this. Yes, I believe so. Energy reserve is definitely 48-hours. Instead, the LM54 caliber, constructed for Louis Moinet by way of a movement producer Concept, continues to be specially designed so the traditional operation of the automated mechanism are usually hidden aside on the back again of the motion, beneath the dish, leaving only the chronograph system exposed for the dial. The particular reference 912. ND. 0123. RX Hublot MP-12 Crucial Of Time Skeletal system watches is restricted to twenty pieces and it is priced at $288, 000. This particular watches stands apart immediately because of its retro-styling plus eye-catching call that features a unique chronograph size. Each time I realize the “singing bird action” in operation We quickly create a smile upon my encounter. Frankly, which is overall develop of the timepieces for me — it simply looks great. Retail cost is $3, 250 (production is not limited). And while the particular rigth part of the call is artisticthe left part is more centered on the motion, revealing the particular beating center of the timepieces as well as the off-centered seconds. Girard-Perregaux have had achievement with a lots of the exterior components within this watches, yet it’s the motion that shop lifts the display. The shape through the side proceeds the soft modern really feel, as it lightly curves right down to contour towards the wrist. Lately, TokyoFlash actually seems to be right into a sort of seventies SciFi kind of a theme, mixing wooden (for the situation and bracelet) with slanted shapes plus vivid DIRECTED displays.
    perfectwatchonline.com http://www.perfectwatchonline.com/

  23. Imagen de erik pinzon el dijo:

    Me puedes mandar por favor un archivo .htacess con las lineas de recursos con gzip o con deflate y que solo apunte a www y sobre todo fecha de caducidad o una edad máxima en las cabeceras HTTP de los recursos estáticos. para mi este tema es como entrar a una junglas sin machete.
    si puedes enviarmelo a mi correo te lo agradecere, es para una pagina en joomla 3.3 que estoy diseñando y esos puntos de velocidad de carga me tiene detenido

  24. Imagen de chesskingchessking el dijo:

    Hola, despues de haber pasado 3 semanas viendo que es lo que me hacia falta en forma urgente, subi este fichero a mi web (apache-linux), que como sabes, hace 3 cosas: proteger del acceso al mismo htaccess, darle un caché a los archivos y comprimir.
    Tuve que eliminar toda compresión de archivos js por la razón de que mi sitio, al usar un objeto ajax, parece que fallaban algunos formularios, como por ejemplo, borrar una linea (o borrar todo) de un div. (hacia cosas raras, como eliminar pero luego volvia a aparecer todo, como que no funcionaban los botones. Los cuales si comenzaron a funcionar cuando elimine la parte de la compresion javascript, aunque no estoy seguro de que era ese el motivo, o sea, el objeto xmlhttp)

    Require all denied

    ExpiresActive On
    ExpiresByType image/jpg “access 1 month”
    ExpiresByType image/jpeg “access 1 month”
    ExpiresByType image/gif “access 1 month”
    ExpiresByType image/png “access 1 month”
    ExpiresByType text/css “access 1 month”
    ExpiresByType image/x-icon “access 1 month”

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

    En los primeros minutos todo funcionaba de maravilla. Pero luego, el sitio se cayó y no tuve acceso ni por url ni por ftp. ¿Emilio te das cuenta de donde puede estar el error? Mi sitio está en php + ajax + mysql. Saludos!

  25. Imagen de chesskingchessking el dijo:

    Aclaro en el comentario anterior, que luego de 5 minutos se restauró el sitio y elimine (del susto, por no decir otra palabra) inmediatamente el htaccess.

  26. Imagen de Desarketing el dijo:

    Hola!!

    Contribuyo a la causa:

    # Quitando cache en archivos que se requieren sean actualizados.
    
        Header unset Cache-Control
    
    
    # Tip de seguridad: Con la siguiente norma, ocultamos la ejecución PHP.
    AddType application/x-httpd-php .fuck
    # NO es magia, sólo código. 
    
    # Evitamos el listado de las carpetas...
    Options -Indexes
    
    #set max upload file size // Un clásico en instalaciones de CMSs
    #NOTA: Podéis cambiar valores numéricos. La limitación está en vuestro servidor. 
    php_value upload_max_filesize 8M
    php_value post_max_size 12M 
    php_value max_execution_time 240
    # Fin
  27. Imagen de Luis el dijo:

    Hola amigo buenos dias.. Espero que puedas ayudarme.. Fijate que instale un script en ubuntu server y me instala todo y me deja entrar al admin, pero al momento de entrar a cualquier opcion de la pagina principal me da el error de que la direccion no se encuentra en el servidor. Solo me deja entrar a la pagina principal y al admin nada mas.. Me fije que no tiene el htacces.. Que pienss que podria ser? Que ajustes debo tener ? Gracias de antemano.

  28. Imagen de Juan P. el dijo:

    Hola, gracias por toda la info que posteas, está muy bien.
    Yo soy nuevo en esto de las webs y después de crear la mia y subirla al servidor me di cuenta que los archivos de imágenes no se cargaban.
    Solamente añadiendo el archivo .htaccess con las siguientes lineas si que conseguí que las leyera:
    RewriteEngine on

    RewriteCond %{HTTP_REFERER} !^http://sendadelalma.com/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://sendadelalma.com$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://www.sendadelalma.com/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://www.sendadelalma.com$ [NC]

    #RVS START REDIRECT PAGE

    RewriteEngine on

    RewriteRule ^Inicio\.php$ INICIO\.php [R=301,NE,QSA,L]

    #RVS END REDIRECT PAGE

    ¿es esta la mejor manera?
    Además, la página no tiene archivos php, con lo que creo que las últimas líneas se podrían borrar ¿no?
    GRacias por la ayuda

  29. Imagen de Javier el dijo:

    Hola, muchas gracias.
    He recurrido muchas veces a tu articulo para mejorar mis .htaccess y siempre con un gran resultado. Siempre pienso… luego le doy las gracias y se me olvida. De hoy no pasa. Gracias

  30. Imagen de Charlie Martinez el dijo:

    Hola ¿qué tal? ¡Muy interesante! Quizás puedas ayudarme:
    Los sitios web que diseño no son accesibles a los abonados de una empresa específica proveedora de internet de mi país (Speedy) y ellos me han dicho que no bloquean ningún IP y que configure mis navegadores para que utilicen los DNS públicos de google. Haciendo esto puedo acceder, pero no puedo indicarle a todo el mundo que haga lo mismo. ¿Sabés si habrá algo a nivel HTACCESS que pueda hacer para asegurar que mi web será accedida desde cualquier conexión a internet? Desde ya muchas gracias.

  31. Imagen de camilocamilo el dijo:

    hola emilio, estoy tratando de usar el htaccess para redireccionar varios enlaces de mi pagina actual, pero me muestra este error en pantalla Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator at correo@hotmail.com to inform them of the time this error occurred, and the actions you performed just before this error.

    More information about this error may be available in the server error log.

    las redirecciones en mi las hago asi

    RewriteEngine on

    RewriteRule ^/?preguntas-frecuentes.* /preguntas-frecuentes-globales.php [PT]

    he intentado poniendo [L]; tambien [L, R=301] pero no me funciona, siempre muestr e lmismo error, me podrias dar una mano. gracias.

  32. Imagen de luis alvaradoluis alvarado el dijo:

    hola tienes conocimiento en faucet tengo una pagina en ella el htaccess lo tengo al maximo que permite el servidor y no puedo seguir metiendo instruciones d e bloqueo ya que hay robot quee stan robando btc en mi faucet como puedo ampliar mi archivo para poder seguir metiendo mas instrucciones o algun escrip que permita crear bloqueo sin sobrecargar el htaccess

  33. Imagen de RAY MALDONADORAY MALDONADO el dijo:

    hola un gusto leer tu publicacion, el problema que tengo es que elimine sin querer el archivo .htaccess de la raiz del servidor. y en la raiz del servidor tengo unos archivos html y varias carpetas con diferentes proyectos de wordpress . obviamente cada carpeta de wordpress tiene su archivo .htaccess. la pregunta es como hacer un archivo .htacces para que se ejecuten correctamente dando prioridades a cada proyecto de wordpress.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Puedes usar las siguientes etiquetas y atributos HTML:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre data-language=""> <ul> <ol> <li>
Para poner código usa <pre data-language="[lenguaje]"><code>[código]</code></pre>, y no olvides escapar el HTMl.