web-dev-qa-db-fra.com

Que signifie l'en-tête HTTP If-None-Match: * signifie?

Que signifie l'en-tête HTTP 1.1 suivant?

If-None-Match: *

Je le comprends lorsque j'utilise un ETag fort ou faible ou même une liste d'ETags, mais je ne comprends pas qu'il soit utilisé lors de l'utilisation de star (*).

Edit: Ce serait bien d'avoir un pseudocode (code PHP bien aussi) qui montrerait comment/quoi répondre à "If-None-Match: *".

46
AlexV

La réponse est: cela dépend.

Supposons que nous ayons reçu

If-None-Match: *
If-Modified-Since: <yesterday date>

Et la page a été modifiée aujourd'hui.

Tout d'abord, nous jetons un œil à la * qui nous dit: "Retourne 304 si la ressource est là et que la condition (2) est remplie". Très bien, la ressource existe, MAIS la condition (2) indique: "Renvoyez seulement 304, si la date est postérieure à la date actuelle". Cette condition n'est donc pas remplie et la page sera livrée complètement.

Si nous n'avions pas reçu If-Modified-Since, la réponse aurait été 304.

Si la ressource n'avait pas existé sur demande, nous aurions renvoyé le code approprié (comme s'il n'y avait pas de If-None-Match).

304 ne doit être retourné qu'en réponse aux requêtes GET et HEAD, et tous les en-têtes de réponse liés au cache doivent être présents. Pour tous les autres types de requêtes, votre serveur doit répondre 412 (échec de la condition préalable ).

J'espère que ça aide;)

40
St.Woland

Citant de RFC 2616 (HTTP 1.1) :

... si "*" est donné et qu'une entité actuelle existe pour cette ressource, alors le serveur NE DOIT PAS exécuter la méthode demandée, sauf si cela est nécessaire car la date de modification de la ressource ne correspond pas à celle fournie dans un If-Modified-Since champ d'en-tête dans la demande.

Le RFC poursuit en disant qu'au lieu d'exécuter la demande, les serveurs devraient répondre avec 304 (non modifié) pour GET et HEAD requêtes, et qu'ils devraient répondre avec 412 (précondition échouée) pour tous d'autres types de demande. Mais ce n'est que si le serveur possède réellement une version de la ressource demandée. Si vous n'avez aucune entité, vous devez gérer la demande (probablement avec un 404 puisque vous n'avez rien).

Pour gérer une demande, déterminez d'abord ce que le serveur ferait si cet en-tête n'était pas présent. Si le résultat de cette demande ne serait pas 2xx ou 304, alors servez la demande normalement. Mais si le résultat de la demande serait 2xx ou 304, alors gérez le cas If-None-Modified. Quand c'est une étoile, renvoyez simplement 304 immédiatement (sauf si trompé par If-Modified-Since). S'il s'agit d'une ou plusieurs balises d'entité, vérifiez si l'une de ces balises correspond à la balise de la chose que vous envisagiez de servir de réponse. S'il y a une correspondance, renvoyez 304; s'il n'y a pas de correspondance, servez-le comme vous le feriez normalement.

Plus tard dans le RFC, il y a plus:

La signification de "If-None-Match: *" est que la méthode NE DOIT PAS être exécutée si la représentation sélectionnée par le serveur Origin (ou par un cache, en utilisant éventuellement le mécanisme Vary, voir la section 14.44 ) existe et DEVRAIT être effectuée si la représentation n'existe pas. Cette fonctionnalité est destinée à être utile pour empêcher les courses entre les opérations PUT.

C'est-à-dire que l'étoile permet au client de dire: "NE METTEZ PAS ce fichier s'il y a une version de ce fichier déjà là."

11
Rob Kennedy