Compresión gzip en hosting compartido 1&1

14-Mayo-2010 12 comentarios

compresion gzip en hosting compartido 1and1

Contratar un hosting compartido, conlleva el delegar la gestión del servidor en manos de otros. Suele pasar que el servidor en donde tengamos nuestro sitio alojado no disponga de todos los módulos necesarios para una perfecta optimización de nuestra web. Una de esas optimizaciones es la compresión gzip. Comprimiendo mediante gzip conseguimos reducir el tamaño del html, css y JavaScript a una tercera parte de su tamaño. Siendo esta la manera más eficiente de ahorrar en transferencia de datos. Tema importante también en términos económicos ya que en algunos hostings tenemos transferencia limitada a cierta cantidad.

Paso a describir la forma mediante la cual he conseguido activar la compresión gzip en mi hosting 1&1. Lo primero que hay que hacer es añadir un par de líneas en el .htaccess para que los archivos sean parseados en php5 correctamente:

AddType x-mapp-php5 .php .shtml .html .htm .js .txt .css
AddHandler x-mapp-php5 .php .shtml .html .htm .js .txt .css

Aquí añadimos las extensiones que vayamos a comprimir. Principalmente contenido html y texto como JavaScript o CSS.

Activar la compresión gzip

La activación de la compresión gzip la podemos activar en el php.ini con el siguiente código:

zlib.output_compression = On
zlib.output_compression_level = 9
allow_url_fopen = On

En otros hostings con más módulos activados esto lo suelen hacer a nivel de .htaccess pero a mí no me ha funcionado de esa forma. Con la primera línea estamos activando la compresión en sí. La segunda línea fija el nivel de compresión, los niveles están comprendidos entre 0 y 9. En este caso estamos aplicando la compresión gzip al máximo. Por último se habilitan las envolturas fopen de tipo URL que permiten el acceso a objetos URL como archivos. Las extensiones zlib registran envolturas adicionales.

Problema con las cabeceras de los archivos css y javascript comprimidos

Hasta este punto podremos ver con herramientas como el plugin YSlow de Firefox que la compresión gzip se lleva a cabo. Pero en ciertos navegadores fallan los estilos y el JavaScript contenido en archivos externos. Esto es debido a que la compresión está cambiando las cabeceras de estos archivos a html corriente. La forma de solucionarlo es especificar el tipo de archivo para cada uno de ellos mediante programación.
Lo hacemos con el siguiente código:

    $pathinfo = pathinfo($_SERVER['PHP_SELF']);
    $extension = $pathinfo['extension'];
    if($extension == "css")
    {
    	header("Content-type: text/css");
    }
    if($extension == "js")
    {
    	header("Content-type: text/javascript");
    }

Ahora hay que especificar que en cada llamada se consulte este archivo añadiendo esta línea al php.ini:

auto_prepend_file = [RUTA_FISICA]/contentHeader.php

Intenté hacer lo mismo a nivel de php pero siempre conseguía un error 500. Así que tuve que optar por ejecutarlo a nivel de php.ini . Hay que especificar la ruta física dentro del servidor, la cual podemos consultar con el siguiente archivo en php:

$ruta_absoluta = getcwd();
echo 'Ruta física: ' . $ruta_fisica;

Si ejecutamos este código en el directorio donde tengamos el contentHeader.php veremos la información que nos falta para su correcta implementación. Una vez completado todo el php.ini hay que destacar que debemos copiarlo a todas las carpetas donde hayan archivos css y JavaScript. Ya que el php.ini solo se aplica a la carpeta en donde esté contenido.

Palabras destacadas en Compresión gzip en hosting compartido 1&1:

12 Respuestas to “Compresión gzip en hosting compartido 1&1”

  1. clvsonic dice:

    Hola me gustaria saber como puedo activar en 1&1 pero para html

  2. jose dice:

    El proceso descrito en el post realiza la compresión gzip de html además de comprimir el css y javascript. Si quieres, puedes ver el resultado con el plugin YSlow para Firefox sobre esta web.

  3. clvsonic dice:

    E conseguido al final ponerlo para ie pero en firefox me falla, es que soy un poco torpe para estas cosas…. aver cuando pones ruta absoluta y ruta fisica no es lo mismo?

  4. jose dice:

    Correcto, es lo mismo. Ya lo he cambiado en el post, gracias por la observación. En cuanto a que en Explorer te funcione y en otros no. Supongo que te estará fallando el javascript y el css. Y lo verás todo sin estilos. Recuerda que la pega de realizar de esta forma la comprésión gzip es que el php.ini que generes debe estar en la carpeta raíz para que comprima el html. Y en todas las carpetas que contengan archivos css y javascript. Si no, esos archivos no los interpretará correctamente.

  5. wakumaku dice:

    Muchísimas gracias!
    Ha funcionado perfectamente en mi hosting de 1and1! Hacía como 6 meses que andaba buscando una solución y esta es perfecta.
    Lo único que me ha costado captar era el tema del `prepend`, que no había pillado que se tiene que crear el archivo `contentHeader.php`.

    Pero bueno, que muy agradecido!

    Saludos,

  6. Cristian dice:

    Ante todo perdón por escribir en un post antiguo, pero es el unico que ha solucionado mi problema.
    Yo tb trabajo con 1&1 y siguiendo tus pasos he conseguido comprimir mi web en un 80%, una maravilla.
    Pero …
    Tengo configurada en .htaccess una línea para que en caso de error 404 redirigir al usuario a una pagina de error personalizada:

    ErrorDocument 404 http://tienespoker.com/404page.html

    El caso es que desde que puse el codigo php que has dado en .htaccess para comprimir la web:

    AddType x-mapp-php5 .php .shtml .html .htm .js .txt .css
    AddHandler x-mapp-php5 .php .shtml .html .htm .js .txt .css

    La orden de redireccionamiento a mi web personalizada de error 404 deja de funcionar, y redirige al usuario a la web de error de 1&1
    Las lineas de redireccionamiento 301 que tambien tengo siguen funcionando y la redireccion del dominio con www. a sin www. tambien.

    He comprobado que si borro el codigo php de compresión todo vuelve a la normalidad.
    Alguna idea para no tener que elegir y que funcionen ambas cosas?

    Otra vez gracias, por todo
    Saludos

  7. Jonatan dice:

    Hola a ver si me puedes aclarar unas dudas, porque no doy con la tecla.
    Hay que crear un archivo llamado contentHeader.php y poner el contenido de “$pathinfo = pathinfo($_SERVER['PHP_SELF']);…….”
    o en el contentHeader tenemos que poner algun dato de nuestro servidor?? de ser así cual.
    Y en el caso del auto_prepend_file, el siguiente formato seria valido??
    auto_prepend_file= http://www.mipaginaweb.com/contentHeader.php
    Gracias!!

  8. jose dice:

    No tienes que pedir perdón por nada Cristian. Lo único que se me ocurre es que intentes cambiar el orden de las instrucciones de la compresión y de ErrorDocument porque la verdad es que creo que no me ha ocurrido nunca lo que comentas.
    Espero que soluciones tu problema, un saludo.

  9. jose dice:

    Hola Jonatan
    Hay que crear un archivo que yo he llamado contetHeader.php y poner la ruta física real dentro del servidor de este archivo en la variable auto_prepend_file definida dentro de los archivos php.ini. Por lo que el valor que tu planteas para esta variable no es válido. Si en el directorio donde vas a colocar el contetHeader.php creas un php en donde visualices el valor de getcwd() puedes conocer la ruta física dentro del servidor de la que te estoy hablando.
    Espero haber aclarado tus dudas, un saludo.

  10. Jonatan dice:

    Hola de nuevo, pero no sé que hago mal.
    Tengo el php.ini con la compresion activada y comprobado con diversas webs que testean la compresion.
    Tengo el htaccess con las instrucciones que has dado para que los archivos sean parseados.
    Tengo el contentHeader, con el mismo contenido que tu has puesto.
    Y por último he creado el php que me comentabas para que me dijera la ruta, que es esta. /homepages/7/d289931163/htdocs/tienda/ y la he añadido al php.ini. Por lo que el php.ini, tiene el siguiente contenido

    allow_url_fopen = On
    zlib.output_compression = On
    zlib.output_compression_level = 9

    auto_prepend_file = /homepages/7/d289931163/htdocs/tienda/contentHeader.php

    Pero la pagina me sigue cargando sin estilo.
    Me puedes ayudar por favor?? Gracias!!

  11. jose dice:

    Si lo único que te falla es el css e imagino que este código lo tendrás en un directorio específico. ¿Hay un archivo php.ini también en ese directorio desde el que se sirve el css de la página?. Debe haber un php.ini en cada uno de los directorios donde hayan archivos css y js. Si no es así, el archivo contentHeader no se aplica sobre estos archivos y son devueltos como html en lugar de css o js respectivamente y ciertos navegadores no los interpretan bien.

  12. Jonatan dice:

    Muchas gracias jose, tenias razón, hice los cambios que me comentastes y ya funciona perfectamente. Ha pasado un tiempo pero queria volver para darte las gracias.
    Un saludo

Escribir un comentario