Compresión gzip en hosting compartido 1&1
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.

Hola me gustaria saber como puedo activar en 1&1 pero para html
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.
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?
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.
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,
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
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!!
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.
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.
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!!
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.
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