Header if-modified-since


Le header if-modified-since est un champ de données dans la communication HTTP entre le serveur et différents clients, tels que les navigateurs et les robots d’exploration des moteurs de recherche. Lorsqu’un client accède à un serveur qui supporte ce header-champ de données, la condition selon laquelle les contenus sur le serveur ont été modifiés depuis le dernier accès par ce client est vérifiée. Lorsque les contenus sont identiques, le serveur envoie le code de statut 304 à la place des contenus consignés afin d’informer le client qu’il n’a pas besoin de charger les contenus. À la place, le client peut également charger une version du site Internet placée en mémoire cache : dans le cas des robots d’exploration, il s’agit de la version consultée en dernier ; dans le cas des navigateurs, il s’agit de la version qui se trouve dans la mémoire cache du navigateur depuis le premier chargement. Conformément aux consignes aux webmasters de Google, l’utilisation du header if-modified-since est conseillée afin que le robot d'exploration de Google ne charge aucune ressource inutile.

Informations générales[modifier]

En relation avec la communication http, les développeurs et les webmasters disposent de diverses options pour influencer le comportement des serveurs et des clients. Cette « mise en cache http » comprend différentes méthodes de contrôle des critères qui concernent les requêtes (requests) et les réponses (responses). Les principes suivis par Firefox sont par exemple les suivants : Expiration et Validation. Les headers if-modified-since et last-modified font partie de la Validation : la validité actuelle d’un document ou d’une ressource est vérifiée. De cette manière, les requêtes du serveur, la transmission des données et les durées d’accès sont réduites afin de réguler les temps d’attente du côté du client, l’utilisation du côté du serveur et la bande passante utilisée lors de la transmission des données. L’utilisation des ressources du robot d’exploration du moteur de recherche et l’overhead (les données destinées à l’administration des données) sont également réduits.

Pour ce faire, les headers if-modified-since et last-modified utilisent un chronotimbre, consulté par le client. L’indication fournie par ce chronotimbre est obligatoire dans tous les protocoles http – dans le cas contraire, aucune demande conditionnelle ne peut avoir lieu puisqu’aucune condition n’est disponible. Dans le cadre de l’Hypertext Transfer Protocol 1.1 (HTTP 1.1), des "ETag HTTP" sont disponibles afin de spécifier la délivrance de contenus et la sauvegarde provisoire dans la mémoire cache du client. Les ETags indiquent une ressource. Apache constitue l’ETag à partir de l’inode, tandis que nginx utilise la file size et le timestamp. Les ETags sont ensuite comparés et, en cas de concordance, le code de statut correspondant (par exemple 304) est envoyé.

Mode de fonctionnement[modifier]

Le champ de données if-modified-since est utilisé en association avec la méthode GET : un client envoie une demande à un serveur à l’aide de commandes GET placées dans le header. Le serveur répond en renvoyant les données demandées. Lorsque le document demandé n’a pas été modifié, le client n’a pas besoin de la totalité du document, mais uniquement de son header – en cas de vérification positive du conditionnel (if-modified-since), le corps du document n’est pas envoyé. Le conditionnel est vérifié en comparant l’estampille fournie avec la date actuelle.

  • Le serveur répond à l’aide d’un code de statut 200 : le document a été modifié et doit donc être chargé.
  • Le serveur répond à l’aide d’un code de statut 304 : le document n’a pas été modifié et ne doit donc pas être chargé.

Le header d’une demande HTTP conventionnelle avec la méthode HEAD, qui demande seulement les données d'en-tête d’un document, ressemble par exemple à ceci :

HEAD /~si/index.html HTTP/1.0
 
HTTP/1.1 200 OK
Date: Thu, 23 Nov 2000 11:21:36 GMT
Server: Apache/1.3.12 ...
Expires: Fri, 24 Nov 2000 11:21:39 GMT
Content-Length: 15643
Last-Modified: Wed, 15 Nov 2000 13:11:22 GMT
Connection: close
Content-Type: text/html

Dans l’antépénultième ligne de la demande se trouve le champ de données last-modified, ainsi que l’estampille en heure GMT standardisée. Cette demande engendre un code de statut 200 normal avec une indication de la dernière version modifiée du fichier. Les contenus sont chargés par le client – peu importe qu’il s’agisse d’un navigateur ou d’un robot d’exploration du moteur de recherche. L’élément important est le chronotimbre figurant sur le document puisqu’en son absence, aucune demande conditionnelle ne peut avoir lieu. Il contient l’heure du serveur, synchronisée avec l’heure du client à l’aide du format GMT.

Si une méthode GET est utilisée avec le header if-modified-since, la réponse du serveur ressemble à ceci :

GET /~si/index.html HTTP/1.0
If-Modified-Since: Wed, 15 Nov 2000 13:11:23 GMT
 
HTTP/1.1 304 Not Modified
Date: Thu, 23 Nov 2000 11:23:02 GMT
Server: Apache/1.3.12 ...
Connection: close
Expires: Fri, 24 Nov 2000 11:23:06 GMT

Le fait que le serveur renvoie un code de statut 304 est uniquement rendu possible par la requête de l’estampille et l’assistance du côté du serveur. Dans le cas où le document a été modifié, le serveur envoie un code de statut 200. Il est possible de vérifier si le serveur utilisé supporte un code de statut 304 en effectuant une simple requête HTTP à l’aide de différents outils. Le cas échéant, un contact de service permettant de joindre le fournisseur est nécessaire afin de déterminer si c’est le cas. En fonction de la version du serveur et de la technologie installée (Unix, Apache, PHP ou différents CMS tels que Wordpress et Typo3) ces requêtes peuvent non seulement revêtir des apparences variées mais également nécessiter des implémentations différentes les unes des autres. Dans le cas de certains CMS, des plug-ins spéciaux sont mis à disposition.

Importance pour l’optimisation des moteurs de recherche[modifier]

Google recommande d’utiliser le header if-modified-since sur tous les sites web. Les webmasters, les exploitants de sites web et les développeurs doivent suivre ces recommandations si les contenus de leurs sites ne font pas l’objet de modifications fréquentes. Lorsque le Googlebot a déjà consulté une URL, il insère automatiquement le champ de données if-modified-since dans ses demandes. À travers le formatage de la date et de l’heure au format GMT, conforme au protocole HTTP, le serveur peut déterminer si le document a été modifié. Avec la réponse du serveur, le Googlebot est ensuite informé d’un quelconque changement depuis sa dernière visite (200+body vs. 304 header-only). Si ce n’est pas le cas, il gagne le temps qu’il aurait consacré à consulter ce document – et donc la bande passante utilisée lors de la transmission des données et l’overhead inutile (il s’agit de métadonnées engendrées lors de la transmission de données selon le protocole HTTP). Ainsi, la charge du serveur est également minimisée par le Googlebot.

Liens web[modifier]