Compressione gzip senza il modulo apache mod_gzip

LA maggior parte dei servizi di shared hosting offrono la compressione gzip di default, come per esempio dreamhost dove al massimo è da disattivare non da attivare. Invece con lunarpages (che per la cronaca anche se non centra nulla ieri un attacco DoS lo ha fatto andare interamente down per un oretta) con il servizio base di shared hosting non consente di attivare il modulo di apache mod_gzip.

C’è un modo forse un po macchinoso ma comunque funzionale per ovviare a questo. Essendo che utilizzano suPHP è possibile tra le altre cose personalizzare il file di configuarazione php.ini per ogni cartella sul server. Ciò consente di abilitare zlib.output_compression ovvero l’estensione di PHP che a runtime “on-th-fly” al volo come recita il manule di php comprime l’html risultante da una pagina php prima di inviarlo ai browser. Per attivarlo quindi basta creare un file php.ini e scriverci:

zlib.output_compression = On
zlib.output_compression_level = 6

Per poter comprimere tutti i documenti, dai fogli di stile ai javascript, e non solo gli script php basta far processare a PHP tutti i file che vogliamo comprimere, pertanto andremo a scrivere nel file .htaccess

AddHandler application/x-httpd-php5 .css .html .js
suPHP_ConfigPath /home/username/public_html/

La direttiva AddHandler serve a far processare a PHP tutti i file con estensione .css, .html e .js potete aggiungere ogni estensione che vi pare, la seconda riga invece serve per specificare il percorso del file di configurazione php.ini, al posto di username va ovviamente il vostro username e dopo public_html potete specificare qualsiasi percorso dove sia presente un file php.ini.

Ora tutti i file prima di essere visualizzati verranno compressi, questo però può comportare dei grossi problemi, l’header di risposta per esempio di un foglio di stile potrebbe non essere più lo stesso, pertanto bisogna ristabilire gli header giusti. Un modo molto semplice è includere prima di ogni file questo script.

<?php
$path = pathinfo($_SERVER['SCRIPT_NAME']);
 if ($path['extension'] == 'css')  {
 header('Content-type: text/css');
}
if ($path['extension'] == 'js')  {
 header('Content-type: application/x-javascript');
}
?>

per farlo bisogna salvare questo script in un file denominato per esempio pre.php e aggiungere al file php.ini questa riga:

auto_prepend_file = "/home/username/public_html/pre.php"

Così ora i file con estensione .js, .css e .html prima verranno processati da php quindi compressi poi gli sarà restituito il giusto header e infine inviati al browser. Attenzione che se avete dell’xml all’interno di questi file tra i tag <?xml ... ?> verrà processato da php, per ovviare a questo basta aggiungere a php.ini il comando:

short_open_tag = 0

questo disabilita gli short tag <? ... ?> per php quindi come è giusto che sia tutto il codice php va messo assolutamente all’interno dei tag <?php ... ?>