SmythSys IT Consulting

Usar compresión GZip en tus páginas web, por ejemplo en Prestashop

Una de las cosas que más cuentan los buscadores es la rapidez de tu página. Y esta puede verse afectada o por mal código, o por mucho acceso.  Los hosting compartidos tienen un ancho de banda limitado (y unos recursos de servidor).Evidentemente cuanto más gente acceda más afecta al rendimiento. Por lo tanto es buena idea que el servidor comprima el contenido de la página web, lo que hace que no afecte tanto al ancho de banda y el lector reciba antes la información. En WordPress por ejemplo hay módulos que dan el contenido de páginas dinámicas a las que se accedan mucho en modo estático, optimizando bastante la velocidad de acceso.

Pero es que aunque no contara para el SEO, evidentemente una persona que note que la web vaya lenta…acabará hartándose y marchándose. Por lo tanto es buena idea activar la compresión GZip en el servidor, a veces reduce hasta un 80% el tamaño de las páginas. Aquí te decimos cómo:

Apache consigue la compresión a través de los módulos mod_gzip y mod_deflate. Para ello primero tendrás que ver si están activados en tu proveedor. Puedes usar un fichero php_info(). SI están cargados pero no está haciendo la compresión puedes activarlos a través de .htaccess (pequeño fichero que se añade en la raíz para modificar parámetros de Apache y php).  SI ESTÁN ACTIVADOS LOS MÓDULOS:
Para activarlo para html y texto:

# compress all text and html:

AddOutputFilterByType DEFLATE text/html text/plain text/xml
# Or, compress certain file types by extension:
<Files *.html>
SetOutputFilter DEFLATE
</Files>
Con mod_deflate puedes elegir los ficheros a comprimir (gif,jpeg, png:

<Location />
    SetOutputFilter DEFLATE
      SetEnvIfNoCase Request_URI 
        .(?:gif|jpeg|png)$ no-gzip dont-vary
    SetEnvIfNoCase Request_URI 
        .(?:exe|t?gz|zip|gz2|sit|rar)$ no-gzip dont-vary
</Location>

Así lo puedes hacer con mod_gzip:

<IfModule mod_gzip.c>
    mod_gzip_on       Yes
    mod_gzip_dechunk  Yes
    mod_gzip_item_include file      .(html?|txt|css|js|php|pl)$
    mod_gzip_item_include handler   ^cgi-script$
    mod_gzip_item_include mime      ^text/.*
    mod_gzip_item_include mime      ^application/x-javascript.*
    mod_gzip_item_exclude mime      ^image/.*
    mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</IfModule>

 En nuestro caso los módulos estaban pero desactivados. Prestashop metía el código correcto pero Apache ni caso. Así que SI NO ESTAN ACTIVOS LOS MÓDULOS:

Usando PHP:

Puedes meter este código en cada página de PHP que quieras que se comprima. O, como en nuestro caso, en una que se cargue siempre (en Prestashop usamos config/config.inc.php).

<?php

    if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip'))
        ob_start("ob_gzhandler");
    else
        ob_start();
?>

¿Quieres probar a ponerlo en .htaccess en vez de en cada fichero? A nosotros no nos funcionó pero como depende de cada servidor puedes probarlo. Para sólo los php:

<FilesMatch ".(txt|html|htm|php)">
    ForceType application/x-httpd-php
    php_value auto_prepend_file /the/full/path/gzip-enable.php
</FilesMatch>

Para hacerlo para todos los ficheros. Primero:
php_value output_handler ob_gzhandler

Luego por ejemplo para los CSS crea este fichero gzip-css.php y pon:

<?php
   // initialize ob_gzhandler function to send and compress data
   ob_start ("ob_gzhandler");
   // send the requisite header information and character set
   header ("content-type: text/css; charset: UTF-8");
   // check cached credentials and reprocess accordingly
   header ("cache-control: must-revalidate");
   // set variable for duration of cached content
   $offset = 60 * 60;
   // set variable specifying format of expiration header
   $expire = "expires: " . gmdate ("D, d M Y H:i:s", time() + $offset) . " GMT";
   // send cache expiration header to the client broswer
   header ($expire);
?>

Después en el .htaccess:

<FilesMatch ".(css)">
    ForceType application/x-httpd-php
    php_value auto_prepend_file "/the/full/path/of/this/file/gzip-css.php"
</FilesMatch>

Para los JavaScrip crea el fichero gzip-js.php:

<?php

   // initialize ob_gzhandler function to send and compress data
   ob_start ("ob_gzhandler");
   // send the requisite header information and character set
   header ("content-type: text/javascript; charset: UTF-8");
   // check cached credentials and reprocess accordingly
   header ("cache-control: must-revalidate");
   // set variable for duration of cached content
   $offset = 60 * 60;
   // set variable specifying format of expiration header
   $expire = "expires: " . gmdate ("D, d M Y H:i:s", time() + $offset) . " GMT";
   // send cache expiration header to the client broswer
   header ($expire);
?>
 y pon esto en el .htaccess:
<FilesMatch ".(js)">
    ForceType application/x-httpd-php
    php_value auto_prepend_file "/the/full/path/of/this/file/gzip-js.php"
</FilesMatch>

Para ver cómo hacerlo en un servidor Tomcat pincha aquí.

 

 

16 comentarios en «Usar compresión GZip en tus páginas web, por ejemplo en Prestashop»

  1. Hola, un artículo muy bueno, justo lo que estaba buscando, pero para los que no tenemos mucha idea un poco complicadillo 🙂 Empezando por lo más básico:

    “Para ello primero tendrás que ver si están activados en tu proveedor. Puedes usar un fichero php_info(). ”

    Cómo se usa ese fichero? gracias!

    Responder
  2. Hola, de antemano muchas gracias, voy a probar pero tengo una duda. Una vez creados los ficheros gzip-js.php y gzip-css.php en PrestaShop, dónde los úbico?

    Thnks!

    Responder
  3. Funciona perfectamente, antes de configurar el htacces mi velocidad en GooglePage Speed era de 52 en moviles y 63 en ordenadores, ahora gracias a ti es del 100%.

    Gracias.

    Responder
  4. hola muy bueno el tutorial funciona a la perfeccion e probado miles de codigos para habilitar la compresion y no e dado con ninguno solo con estos pero tengo un problema a darle la compresion a los css y js el problema es de que se me desconfigura todoa la pagina no guarda el orden de como lo tengo todo alguna sugerencia muchas gracias de antemano y buen tuto saludos

    Responder
    • Si…. nos ha pasado a veces con los css. Lo mejor que puedes hacer es no comprimirlos si te pasa eso (sólo pasa en ciertos casos). Comprime el resto de páginas pero excluye los css.

      Responder
    • Hola,
      ¿has hecho una prueba de Pagespeed? Por lo que veo tienes sobre todo avisos de tamaño de imágenes, imágenes de nueva generación y alguna de caché.
      Hay que recordar que Prestashop no es el CMS más optimizado para velocidad. Pero todavía puedes exprimir algo.
      Puedes comprar un módulo de Lazy load y Webp para Prestashop.
      TAmbién puedes usar un CDN como Cloudflare.

      Responder

Deja un comentario

Resumen de nuestra Política de Privacidad

  • Responsable: SmythSys IT Consulting SLNE.
  • Finalidad: Gestionar y moderar los comentarios.
  • Legitimación: Necesitas dar tu consentimiento para publicar un comentario.
  • Destinatarios: Tus datos se alojan en los servidores de OVH.
  • Derechos: Tienes derecho a acceder, rectificar, limitar y suprimir los datos en la dirección del responsable (en nuestra política de privacidad).