web-dev-qa-db-fra.com

Pas de mod_expires ni de mod_headers dans Apache, comment puis-je mettre en cache des fichiers images / js / css?

Title dit tout, nous n’avons aucun contrôle sur notre environnement de serveur et, bien que nous puissions leur demander de recompiler Apache pour nous, cela ne se fera pas du jour au lendemain.

Pouvons-nous faire quelque chose si ces modules (mod_expires, mod_headers) ne sont pas disponibles pour vous aider à spécifier que certains contenus (images, js, css) doivent être mis en cache ou avons-nous trop de chance?

6
Chris

Une option consiste à les envoyer via un script PHP et à le faire sortir des en-têtes de mise en cache pour vous. Il accomplit la même chose avec seulement un peu de charge supplémentaire car il a fallu que PHP serve l'image en tant que proxy.

Exemple:

HTML:
<img src="/images/img.php?img=someimage.png">

PHP:
<?php
    $filename = $_GET['img'];
    $file = '/path/to/file/' . $filename;

    // Do verification that the file exists, they're not after any secure 
    // files, etc. Not shown here   

    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($file));
    header('Content-Transfer-Encoding: binary');
    header("Last-Modified: " . date( "D, j M Y H:i:s", strtotime("- 1 month")));
    header("Expires: Thu, 20 Sep 2012 05:00:00 GMT");
    header("Cache-Control: max-age=2692000, public"); 
    header("Pragma: cache"); 
    ob_clean();
    flush();
    readfile($file);
    exit;

?>
6
John Conde