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.
la source
Réponses:
Lorsque le navigateur met quelque chose dans son cache, il stocke également l'en
Last-Modified
-ETag
tête ou du serveur.Le navigateur envoie alors une demande avec l'en
If-Modified-Since
-If-None-Match
tê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.
la source
ETag
est le mot-clé, vérifié avec les en-têtesETag
reste le même dans les deuxResponse Headers
&Response Headers From Cache
, pouvez-vous dire l'algorithme derrièreETag
. J'ai mis à jour ma question en indiquant mes besoins.ETag
est 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.max-age
le 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 demax-age
...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:
le serveur retournera 304 lorsque l'instruction if vaut False et le navigateur utilisera le cache.
la source