sábado, 26 de febrero de 2011

Habilitar compresión para css, js y html en hosting compartido de Redcoruna

Para que el servidor mande los archivos css y js comprimidos al navegador de forma automática hay gran cantidad de opciones pero por desgracia dependen de como está configurado el servidor. Después de probar con un millar de opciones he logrado una, a través de php, que me funcione bajo el plan RedComenzo de RedCoruna.

Se crea un archivo llamado .htaccess si no existe en "/home/user/public_html", para que se aplique a nivel general, o en la ubicación que deseemos y se le añade lo siguiente:

AddHandler application/x-httpd-php5 .css 
AddHandler application/x-httpd-php5 .js 
AddHandler application/x-httpd-php5 .html 

<IfModule mod_suphp.c>
  <FilesMatch "\.(css|js|html)$">
    suPHP_ConfigPath /home/user/public_html
    <Files php.ini>
      order allow,deny
      deny from all
    </Files>
  </FilesMatch>
</IfModule>

Para que lo escrito en el archivo "php.ini" se aplique en general a todo lo que se ejecute a través del handler php se debe eliminar las etiquetas "<FilesMatch>".

En el directorio "public_html" (o en la ubicación que nos parezca más conveniente, se puede crear por ejemplo una carpeta para php.ini y pre.php) se crea un archivo llamado "php.ini" con el contenido:

[PHP] 
zlib.output_compression = On 
zlib.output_compression_level = 6 
auto_prepend_file = /home/user/public_html/pre.php
short_open_tag = 0

Y finalmente en la misma ubicación se crea el archivo llamado "pre.php" que contenga:

<?php
$path = pathinfo($_SERVER['SCRIPT_NAME']); 

if ($path['extension'] == 'css') {
  header('Content-type: text/css');
}
elseif ($path['extension'] == 'js') {
  header('Content-type: application/javascript');
}
elseif($path['extension'] == 'html') {
header('Content-type: text/html');
}
?>

Para tener en cuenta codificaciones de texto y variantes de las extensiones habrá que apurar más, pero sirva esto de punto de partida. Para archivos html debería ser suficiente con el tipo por defecto sin ser necesario especificarlo en el archivo pre.php.

Actualización 10/07/2013
He creado un pequeño set de prueba que podeis descargar aquí. Después de subirlo al servidor. Hay que abrir el archivo path.php con el navegador. Nos dará una ruta para sustituir "ruta/a/carpeta" de los ficheros .htaccess y php.ini. Una vez hecho, ya se puede acceder al index.html y comprobar si funciona la compressión.


Fuentes:

8 comentarios:

  1. Hola
    he realizado los cambios indicados pero no me comprime los .js ni .css
    .htaccess php.ini y pre.php los he puesto en public_html/
    Alguna idea gracias.
    Marisa Valle

    ResponderEliminar
    Respuestas
    1. Decir que me he demorado es poco... bueno, al lío.

      ¿Cómo miras si comprime los archivos? Yo por ejemplo uso la pestaña de red de firebug. En la cabecera de cada archivo como respuesta del servidor debería aparecer algo así:
      "Content-Encoding: gzip"

      ¿Los archivos html sí los comprime? ¿Las extensiones están en minúsculas?

      Lo he vuelto a probar en otra carpeta y me sigue funcionando. El experimento lo he hecho en un "RedComenzo" de RedCoruna. Supongo que no tiene porqué funcionar en otros servidores si tienen una configuración distinta.

      Eliminar
  2. ¡Hola!. En primer lugar deseo darte las gracias por tu información, pues aunque me ocurre lo mismo que a Lencería Sexy, al menos me comprime el HTML con gzip.

    Google Speed me sigue diciendo que los js y css están sin comprimir.

    Estoy en Redcoruna, pero cambie al Plan Evolution porque me quedé colgado con el ancho de banda agotado, aunque seguramente fue debido al spam.
    También tengo mi sitio funcionando con Wordpress...

    ¿Alguna idea de porqué puede ser?
    Mi sitio es literario.net Gracias de antemano y un cordial saludo. Manuel

    ResponderEliminar
    Respuestas
    1. Uy, respondí a nivel general y no creo que te llegara una notificación.

      Eliminar
  3. Hola Manuel,

    Existen otras formas de hacerlo, por ejemplo:
    - Compress your WordPress website
    - Compressed CSS Compression

    Pero la que expongo, mediante un php.ini, es la única que he logrado que me funcione en Redcoruna. De estos enlaces también te puede interesar lo referente a cache.

    Para descartar conflictos con wordpress, primero probaría a hacerlo funcionar en un subdirectorio con lo básico. Ojea el set que he añadido al final del artículo.

    Estaré atento a ver qué resultados obtienes.

    ResponderEliminar
    Respuestas
    1. En primer lugar deseo darte mis más sinceras gracias por tu atención. Le di mil y una vueltas al tema perono conseguí nada positivo.
      Como estoy en Wordpress, finalmente me decidí por instalar W3 Total Caché...
      Había probado también anteriormente WP Total Caché... y es curioso porqué mientras en el segundo conseguía un máximo de 92/100 para la versión de escritorio y un 97/100 para la versión móvil con Page Speed en el primero me da un 100/100 para las dos versiones, pero sin embargo al validar la página con otros servicios online me baja la puntuación de 75 a 48 sobre 100...
      Para mi es un misterio pero de momento la voy a dejar así para ver lo que hace Google...
      Gracias por todo. Manuel

      Eliminar
  4. !Hola, otra vez! :-)

    Deseo pedirte disculpas en primer lugar, luego darte las gracias y felicitarte, pues volví a probar tu método de comprimir los archivos en Redcoruna y funciona perfectamente. No sé porqué el Page Speed de Google me daba que no en un principio y durante bastante tiempo, pero ahora no es así. Me da una puntuación de 92/100 y 90/100 sin usar ningún plugin de compresión. Muchas gracias de nuevo. Manuel

    ResponderEliminar
    Respuestas
    1. Me alegro mucho :)

      Empezaba a pensar que sólo me funcionaba a mí.

      No dudes en preguntarme si necesitas algo.

      Eliminar