1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| <?php
// attention: il faut éviter que la session ne désactive le cache (comportement par défaut) sinon tout ce
// qu'on fait plus bas ne servira à rien
session_cache_limiter("private_no_expire");
// constate pratique pour activer / désactiver le log
define("DEBUG_MODE", true);
// on utilise des dates GMT pour éviter la confusion
date_default_timezone_set('GMT');
// on définit 'access.log' comme fichier de log
ini_set('log_errors', 1);
ini_set('error_log', 'access.log');
ini_set('error_reporting', 0);
ini_set('display_errors', 0);
// ce script va contenir la fonction "check_permissions" (voir plus bas) et d'une manière générale la gestion des
// droits
require "auth.php";
// si on n'a pas reçu le nom de fichier ou si ce dernier n'est pas dans notre repertoire 'img', on prétends que la
// ressource n'est pas trouvée (http 404)
if (!($filename = $_GET['filename']) || !is_file($file = dirname(__FILE__).'/img/'.$filename)) {
header("HTTP/1.1 404 Not Found");
exit;
}
// maintenant on vérifie que l'utilisateur à le droit d'accéder à cette ressource, si tel n'est pas le cas, on envoie
// un forbidden (http 403), on va également vérifier que l'utilisateur ne cherche pas à obtenir le .htaccess
if (!check_permissions($file) || preg_match('~\.htaccess~i', $filename)) {
header("HTTP/1.1 403 Forbidden");
exit;
}
// on regarde la date de dernière modification du fichier et on fait son MD5 pour l'ETAG
$last_modified_time = filemtime($file);
$etag = md5_file($file);
// on réccupère ces mêmes informations que nous a envoyé le navigateur
$client_last_modified_time = $_SERVER['HTTP_IF_MODIFIED_SINCE'] ? trim($_SERVER['HTTP_IF_MODIFIED_SINCE']) : 0;
$client_etag = $_SERVER['HTTP_IF_NONE_MATCH'] ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false;
// dans tous les cas on envoie les headers Last-Modified et Etag
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");
header("Etag: $etag");
DEBUG_MODE && error_log("Requested $file");
// si le navigateur à une version identique (même date ou même etag)
if (strtotime($client_last_modified_time) == $last_modified_time || $client_etag == $etag) {
DEBUG_MODE && error_log("Not modified");
header("HTTP/1.1 304 Not Modified");
exit;
}
// sinon, on détermine l'extension pour envoyer le bon header...
preg_match('~\.(\w+)$~', $file, $matches);
switch (strtolower($matches[1])) {
case 'jpeg':
case 'jpg':
header("Content-Type: image/jpeg");
break;
case 'png':
header("Content-Type: image/png");
break;
case 'gif':
header("Content-Type: image/gif");
break;
default:
header("Content-Type: application/octet-steam");
break;
}
DEBUG_MODE && error_log("Serving $file");
// ...et on balance le contenu du fichier
header('Content-Length: ' . filesize($file));
readfile($file); |
Partager