Table of Contents

Apache2 : mod_expires

Franck Brouard - see revisions

1- Introduction

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.

2- Mise en place

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.

3- Configuration

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>

4- Test

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>

5- Sources

Documentation Apache officielle

mod_expires example

Google speak about Expires