Apache e GZIP statico

Se il vostro host non supporta il deflate/gzip o semplicemente volete risparmiare risorse non ricomprimendo ad ogni richiesta file sempre uguali, c’è un piccolo trucchetto che potete mettere in atto grazie alla mod_rewrite e a un po’ d’astuzia.

Procuratevi gzip per la vostra piattaforma (potete farlo anche direttamente sul server se avete l’accesso alla shell) e comprimete i file statici. Ricordate di lasciare anche il file originale in caso il browser non voglia quello compresso. Evitate inoltre di comprimere i file dinamici, tipo i .php.

Una volta fatto questo, impostate questa regola di apache:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteOptions Inherit
ReWriteCond %{HTTP:accept-encoding} (gzip.*)
ReWriteCond %{REQUEST_FILENAME} !.+\.gz$
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule (.+) $1.gz [QSA,L]
</IfModule>

Il significato è questo: se il browser accetta file compressi con gzip e una versione compressa esiste, invia il file che si chiama nomeoriginale.gz; altrimenti invia nomeoriginale.

Se volete, potete anche comprimere l’output dei file php tramite php.ini:

zlib.output_compression = On
zlib.output_compression_level = 5

Queste due tecniche consentono di risparmiare mediamente il 50% dei dati inviati. Ovviamente il rendimento cambia da file a file, ma sicuramente un miglioramento lo vedrete.

Cattura

Un piccolo consiglio: quando comprimete, verificate sempre che il file originale non sia più piccolo di quello compresso. La cosa non è scontata.

Vi lascio il programmino che ho usato per comprimere questo sito.

static void Main(string[] args)
{
    DirectoryInfo di = new DirectoryInfo("root");
    foreach (FileInfo f in di.GetFiles("*", SearchOption.AllDirectories))
    {
        if(!f.Name.StartsWith(".") && f.Extension != ".php" && f.Extension != ".gz")
        {
            ProcessStartInfo psi = new ProcessStartInfo("gzip.exe", "-9 -k -f \"" + f.FullName + "\"");
            psi.CreateNoWindow = true;
            psi.UseShellExecute = false;
            psi.WindowStyle = ProcessWindowStyle.Hidden;
            Process.Start(psi).WaitForExit();

            FileInfo f2 = new FileInfo(f.FullName + ".gz");

            if(f2.Exists)
                if(f2.Length >= f.Length)
                    f2.Delete();
        }
    }
}

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *