Comment fonctionne exactement «304 Not Modified»?

175
  • Comment les réponses «304 Non modifié» sont-elles générées?

  • Comment un navigateur détermine-t-il si la réponse à une requête HTTP est 304?

  • Est-il défini par le navigateur ou envoyé depuis le serveur?

  • S'il est envoyé par le serveur, comment le serveur connaît-il les données disponibles dans le cache, et comment définit-il 304 sur une image?

Je suppose, s'il est généré par le navigateur:

function is_modified()
{
    return get_data_from_cache() === get_data_from_url();
}

function get_data_from_cache()
{
    return some_hash_or_xxx_function(cache_data);
}

function get_data_from_url()
{
     return some_hash_or_xxx_function(new_data);
}

function some_hash_or_xxx_function(data)
{
     // Do something with the data.
     // What is that algorithm?
     return result;
}

console.log(is_modified());

Je compte sur un fournisseur d'API tiers pour obtenir des données, les analyser et les envoyer dans ma base de données. Les données peuvent ou non changer à chaque demande, mais l'en-tête envoie toujours 200. Je ne veux pas analyser, vérifier le dernier identifiant unique dans DB et ainsi de suite ... pour déterminer le changement de données, ni comparer directement le résultat plutôt que moi md5(), sha1()et crc32()hacher le résultat et fonctionne bien, mais je m'interroge sur le algorithme à déterminer 304.

Je souhaite utiliser le même type d'algorithme pour déterminer le changement de mes données.

VenomVendor
la source
2
Oui, j'ai cherché sur Google comment le 304 non modifié fonctionne , mais je n'ai obtenu aucune réponse.
VenomVendor
1
Vous devez être un peu plus général. google.com/search?q=http%20caching
SLaks

Réponses:

201

Lorsque le navigateur met quelque chose dans son cache, il stocke également l'en Last-Modified- ETagtête ou du serveur.

Le navigateur envoie alors une demande avec l'en If-Modified-Since- If-None-Matchtête ou , indiquant au serveur d'envoyer un 304 si le contenu a toujours cette date ou ETag.

Le serveur a besoin d'un moyen de calculer une date modifiée ou ETag pour chaque version de chaque ressource; cela provient généralement du système de fichiers ou d'une colonne de base de données distincte.

SLaks
la source
1
ETagest le mot-clé, vérifié avec les en-têtes ETagreste le même dans les deux Response Headers& Response Headers From Cache, pouvez-vous dire l'algorithme derrière ETag. J'ai mis à jour ma question en indiquant mes besoins.
VenomVendor
4
@VenomVendor: ETagest juste un champ dans lequel le serveur peut stocker un identifiant unique (généralement un hachage ou un numéro de version ou une horloge vectorielle). Cela ne vous aide pas du tout à calculer cet identifiant; cela dépend de votre code côté serveur.
SLaks
@SLaks: Que se passe-t-il si la page a un appel de base de données ... Il y a une chance que les données de la base de données aient changé ... Dans ce cas, cela n'a pas de sens de vérifier le dernier appel modifié, Correct ?. .Comment cette condition est-elle examinée?
user1050619
3
@ user1050619: C'est à votre serveur de s'assurer que l'ETag est précis. Si vous affichez les données d'une base de données, vous devez les inclure.
SLaks
Une chose qui n'est toujours pas claire est de savoir si si vous avez un grand, max-agele navigateur doit-il faire la demande? (car il pourrait stub en 304 et ne pas faire la demande du tout) ... vous voulez cela, par exemple avec des actifs "empreintes digitales" (ils sont bons pour toujours). Sinon, quel est l'intérêt de max-age...
Andy Hayden
19

Last-Modified: la date de la dernière modification de l'objet demandé

If-Modified-Since: Permet à un 304 Not Modified d'être renvoyé si la date de la dernière modification est inchangée.

ETag: un ETag est un identifiant opaque attribué par un serveur Web à une version spécifique d'une ressource trouvée sur une URL. Si la représentation de la ressource à cette URL change un jour, un ETag nouveau et différent est attribué.

If-None-Match: permet à un 304 Not Modified d'être retourné si ETag est inchangé.

le cache de stockage du navigateur avec une date (Last-Modified) ou un identifiant (ETag), lorsque vous devez à nouveau demander l'URL, le navigateur envoie un message de demande avec l'en-tête:

entrez la description de l'image ici

le serveur retournera 304 lorsque l'instruction if vaut False et le navigateur utilisera le cache.

宏杰 李
la source