if-modified-since vs if-none-match

88

Quelle pourrait être la différence entre if-modified-since et if-none-match? J'ai le sentiment que if-none-match est utilisé pour les fichiers alors que if-modified-since est utilisé pour les pages?

La tour
la source

Réponses:

111

Concernant les différences entre Last-Modified/If-Modified-Sinceet ETag/If-None-Match:

Les deux peuvent être utilisés de manière interchangeable. Cependant, selon le type de ressource et la manière dont elle est générée sur le serveur, l'une ou l'autre des questions ("a-t-elle été modifiée depuis ...?" / "Est-ce que cela correspond toujours à cet ETag?") Peut être plus facile à répondre .

Exemples:

  • Si vous diffusez des fichiers, utiliser les fichiers mtimecomme Last-Modifieddate est la solution la plus simple.
  • Si vous diffusez une page Web dynamique créée à partir d'un certain nombre de requêtes SQL, il peut s'avérer impossible de vérifier si les données renvoyées par l'une de ces requêtes ont changé (à moins qu'elles n'aient toutes une sorte de colonne "Dernière modification"). Dans ce cas, utiliser par exemple un hachage md5 du contenu de la page car ETagil sera beaucoup plus facile.
    OTOH, cela signifie que vous devez toujours générer la page entière sur le serveur, même pour un GET conditionnel. Déterminer ce qui doit exactement entrer dans l'ETag (clés primaires, numéros de révision, ... etc.) peut vous faire gagner beaucoup de temps ici.

Consultez ces liens pour plus de détails sur le sujet:

tendances
la source
J'ai envoyé au navigateur un ETag, mais il ne demande jamais la même page avec If-None-Match. Quel peut être le problème?
Pacerier
2
@pacerier: les navigateurs ne sont pas obligés d'utiliser Etag. Cela pourrait donc être un ancien navigateur et l'ignorer simplement. L'autre possibilité est que l'entité est accédée avec des paramètres d'URL qui changent d'un appel à l'autre. Si le nom de l'entité change, etag ne sera pas utilisé pour différentes demandes.
Rafael Baptista
@RafaelBaptista Pour en savoir plus sur votre deuxième moitié du commentaire, disons que j'ai cette situation: j'ai un serveur de fichiers et le serveur prend en charge le contrôle de version à l'aide d'ETags et pour des raisons de compatibilité descendante, nous avions l'habitude de demander aux clients d'utiliser un paramètre de requête my_current_version = (version ). Si j'envoie une requête HTTP avec des valeurs variables pour my_current_version, mais aussi avec ETags, quel critère, en tant que meilleure pratique, sera priorisé pour déterminer s'il faut servir une nouvelle version ou renvoyer un 304? Merci!
rire_man
1
La façon dont le serveur utilise Etag dépend du serveur. Vous pouvez probablement configurer la plupart des serveurs de fichiers pour ignorer les paramètres avec etag si vous le souhaitez via des règles de réécriture. Vous avez moins de contrôle sur le client - le navigateur. La plupart n'enverront pas un en-tête etag qu'ils ont obtenu pour un ensemble de paramètres dans une demande pour un autre. Une demande client pour l'image? V = 1 n'enverra pas le même etag pour l'image? V = 2. Si j'écrivais mes propres serveurs, j'implémenterais etag comme un hachage du contenu de l'image. Toute URL qui demande une ressource et qui est accompagnée d'un etag qui correspond au hachage de l'image que j'enverrais, je renvoie 304.
Rafael Baptista
22

If-Modified-Sinceest comparé au Last-Modifiedconsidérant auquel If-None-Matchest comparé ETag. Les deux Modified-Sinceet ETagpeuvent être utilisés pour identifier une variante spécifique d'une ressource.

Mais la comparaison de If-Modified-Sinceà Last-Modifiedvous indique si la variante mise en cache est plus ancienne ou plus récente, tandis que la comparaison de If-None-Matchà ETagvous donne simplement des informations si les deux sont identiques ou non. En outre, la plupart des ETaggénérateurs incluent les informations de l' inode spécifique au système, de sorte que le déplacement d'un fichier vers un lecteur différent peut également le modifier ETag.

Gombo
la source
Intéressant, mais pourquoi devrais-je utiliser des chèques «identiques» plutôt que des chèques «modifiés en dernier lieu»? Quels sont les bénéfices? Si vous avez un fichier à servir, laquelle est la meilleure option?
Tour le
7
Avec les ordinateurs, le temps est fragile. Les secondes intercalaires, le basculement entre l'heure de la lumière du jour et les horloges inexactes peuvent tous provoquer une vérification de la «dernière modification» pour renvoyer le mauvais résultat. La comparaison du contenu lui-même (ou du hachage MD5 du contenu) évite ces problèmes.
devdanke
Malgré cela, je comprends parfaitement @devdanke, je dirais que la vérification de l'horodatage est beaucoup plus rapide que la vérification de md5sum. Le but de ces en-têtes est de le rendre rapide, il est parfois préférable de ne pas transférer la nouvelle version d'une entité vers le client plutôt que de charger le serveur avec des E / S. Quoi qu'il en soit, l'utilisateur peut toujours appuyer sur ctrl + shift + R (ou ctrl + F5 ou autre)
Grief
13

La valeur d'horodatage utilisée dans Last-Modified / If-Modified-Since a une précision limitée - une seconde et ce n'est tout simplement pas suffisant pour un contenu à évolution rapide comme, par exemple, une application de chat Web où plus d'un message pourrait être publié à une seconde donnée . ETag / If-None-Match peut aider à résoudre ce problème.

Alex K
la source
9

Comme indiqué dans les meilleures pratiques de Google:

Il est important de spécifier l'un parmi Expires ou Cache-Control max-age, et un parmi Last-Modified ou ETag, pour toutes les ressources pouvant être mises en cache. Il est redondant de spécifier à la fois Expires et Cache-Control: max-age, ou de spécifier à la fois Last-Modified et ETag.

https://developers.google.com/speed/docs/best-practices/caching

Dionysios Arvanitis
la source
cette URL n'a plus de texte similaire à celui-ci. Aucune restriction contre l'utilisation Last-Modifiedavec ETag(ou, du côté useragent, If-Modified-Sinceavec If-None-Match) n'est mentionnée. De même, la spécification W3 ne vous limite pas. Il dit de ne pas utiliser If-Modified-Sinceavec If-Match, mais je suppose que c'est parce que l'ensemble de documents qui ont des dates mises à jour mais le même contenu que celui défini par l'ETag devrait être assez petit.
mpag
3

À moins d'être déclaré faible par le serveur, un ETag est considéré comme un validateur fort et peut donc être utilisé pour satisfaire une requête à distance conditionnelle. Cependant, la plupart des ETags générés automatiquement présentent des difficultés dans les situations de batterie de serveurs, car ils utilisent souvent des informations d'inode et / ou un compteur persistant unique. En pratique, j'ai trouvé que l'en-tête Last Modified était suffisant pour un contenu assez statique, par exemple pour servir du contenu statique protégé, car l'heure d'écriture du fichier fait un validateur raisonnablement bon.

L'ETag est de loin le plus flexible. Les clients conformes sont tenus d'envoyer l'ETag dans une demande conditionnelle, alors qu'ils DEVRAIENT envoyer les deux s'ils sont disponibles.

Thomas S. Trias
la source
0

L'en-tête If-Modified-Since est utilisé pour spécifier l'heure à laquelle le navigateur a reçu pour la dernière fois la ressource demandée. L'en-tête If-None-Match est utilisé pour spécifier l'étiquette d'entité que le serveur a émise avec la ressource demandée lors de sa dernière réception.

Dans les deux manières décrites, ces en-têtes sont utilisés pour prendre en charge la mise en cache du contenu dans le navigateur, et ils permettent au serveur d'indiquer au navigateur d'utiliser une copie mise en cache d'une ressource, plutôt que de répondre avec le contenu complet de la ressource si c'est pas nécessaire.

Serhan M.
la source