Le module apache mod_expires définit la valeur de la date d'expiration inscrite dans les champs headers HTTP “Expires” transmis dans les réponses du serveur.
Le champ d'en-tête HTTP Expires est une instruction donnée au client en rapport avec la validité des informations contenues dans le document. Si ce document est enregistré dans le cache du client, alors il sera reaffiché à partir de cette version cachée plutôt qu'à partir de sa version originale tant que la date d'expiration n'a pas été dépassée. Après cette date, la copie maintenue en cache est considérée comme “expired” et est donc obsolète, et une nouvelle copie de l'original devra être rechargée à partir du serveur d'origine de la ressource.
Pour les sites a fort trafic au niveau des ressources statiques, ce modules peux faire économiser beaucoup de bande passante.
Toutefois sont utilisation n'est pas sans inconvenient, puisque si un navigateur garde des elements pendant 24H, il se peut qu'entretemps l'element ai changé sur le serveur. Il convient donc de sérieusement réfléchir aux paramétrages de ce module, en fonction de nombreux paramètres : éléments du site, fréquence de mise a jour, importance du changement de l'information…
Toutefois, si un fichier important venait à être modifier, il est toujours possible de changer le nom de la ressource pour une prise en compte immédiate.
Par les packets binaires (Debian dans mon exemple) :
sudo a2enmod expires /etc/init.d/apache2 restart
Par la compilation :
Lors du lancement du script "./configure" ajouter "--enable-expires" a vos paramètres.
Une fois mis en place, il faut maintenant configurer vos sites pour qu'ils communiquent les dates d'expiration des différents éléments de votre site. C'est le fichier .htaccess de votre site qui permet d'indiquer à apache2 la configuration.
$ cd /var/www/racine_du_site $ vi .htaccess
#On commence par activer la génération des en-têtes Expires
ExpiresActive On
#Regle par défaut : les fichiers du site expirent au bout d'une heure dans le cache du client
ExpiresDefault "access plus 1 hour"
#Règles secondaires, au cas par cas : # Fichiers html : 2h
ExpiresByType text/html "access plus 2 hours"
# Fichiers css : 1h (j'adore modifier mes css pour ajouter une ombre portée ou autre a 3h du mat)
ExpiresByType text/css "access plus 1 hours"
# Scripts javascript : 2mois (je ne les modifie jamais)
ExpiresByType text/javascript "access plus 2 month"
# Fichiers images : 1 mois
ExpiresByType image/gif "access plus 1 month" ExpiresByType image/jpg "access plus 1 month" ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/png "access plus 1 month" ExpiresByType image/x-icon "access plus 1 month"
-Tous les paramètres de durée possibles sont spécifiés sur cette page.
-Tous les types de fichiers envoyés par un serveur web peuvent etre traités. Regardez les headers de vos pages/fichiers en cherchant le champs “Content-Type”, ou regarder sur cette page.
<note tip>Vous trouverez sur plusieurs sites des configuration sous la forme “ExpiresByType image/gif A2592000” je trouve cette notation incompréhensible, c'est pour cela que je vous propose l'autre méthode.</note>
Sur un fichier PNG :
HTTP/1.1 200 OK Date: Tue, 13 Dec 2011 12:33:25 GMT Server: Apache/2.2.16 (Debian) Last-Modified: Mon, 19 Sep 2011 19:01:43 GMT ETag: "3e0051-e03-4ad4ff94653c0" Accept-Ranges: bytes Expires: Thu, 12 Jan 2012 12:33:25 GMT Content-Type: image/png Cache-Control: max-age=2592000, proxy-revalidate Content-Length: 3587 Proxy-Connection: Keep-Alive Connection: Keep-Alive Age: 0
Sur une page html :
Age:0 Cache-Control:max-age=7200 Connection:Keep-Alive Content-Encoding:gzip Content-Length:1801 Content-Type:text/html; charset=ISO-8859-1 Date:Tue, 13 Dec 2011 12:36:09 GMT Expires:Tue, 13 Dec 2011 14:36:09 GMT Proxy-Connection:Keep-Alive Server:Apache/2.2.16 (Debian) Vary:Accept-Encoding X-Powered-By:PHP/5.3.3-7+squeeze3
<note tip>Le champs ETAG est utilisé dans le cadre ou le cache-control n'est pas mis en place pour vérifier si le fichier en cache correspond bien au fichier du serveur. Comme nous utilisons le cache-control, il est possible de simplifier ou de supprimer l'ETAG. </note>