HTTP 304 devrait pas modifié-réponses contiennent des en-têtes de contrôle du cache?

StackOverflow https://stackoverflow.com/questions/1587667

  •  22-09-2019
  •  | 
  •  

Question

Je l'ai essayé de le comprendre, et recherché SO pour des questions similaires, mais je ne comprends toujours pas une compréhension de 100% sur la façon dont cela est censé fonctionner.

Je reçois cette réponse à la demande d'une ressource d'image:

Response Headers
    Server  Apache-Coyote/1.1
    Date    Mon, 19 Oct 2009 09:04:04 GMT
    Expires Mon, 19 Oct 2009 09:06:05 GMT
    Cache-Control   public, max-age=120
    Etag    image_a70703fb393a60b6da346c112715a0abd54a3236
    Content-Disposition inline;filename="binary-216-420"
    Content-Type    image/jpg;charset=UTF-8
    Content-Length  4719

Le comportement souhaité est que le client doit mettre en cache les 120 secondes, puis demande à partir du serveur à nouveau. Dans les 120 secondes, aucune demande est envoyée au serveur.

Alors, au bout de 120 secondes, une requête est envoyée et une réponse 304 est reçue:

Response Headers
    Server  Apache-Coyote/1.1
    Date    Mon, 19 Oct 2009 09:06:13 GMT

Request Headers
    Host    localhost:8080
    User-Agent  Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
    Accept  image/png,image/*;q=0.8,*/*;q=0.5
    Accept-Language en-us,no;q=0.8,sq;q=0.7,en;q=0.5,sv;q=0.3,nn;q=0.2
    Accept-Encoding gzip,deflate
    Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive  300
    Connection  keep-alive
    Referer http://localhost:8080/cms/site/0/en/home
    Cookie  JSESSIONID=768ABBE1A3BFABE3B535900233330650; versionsCssDisplayState=block; iceInfo=iceOn:false,activePortletKey:,icePagePanelX:1722,icePagePanelY:3
    If-None-Match   image_a70703fb393a60b6da346c112715a0abd54a3236

Jusqu'à présent, tous bien. Mais, à la demande suivante (ESSOR 120 secondes) j'aurais pensé que la ressource doit être mise en mémoire cache pour 120 nouvelles secondes. Ce que je vois dans le navigateur (Firefox) d'autre part, est que de ce point sur demande toujours la ressource et reçoit le 304-réponse.

Suis-je censé fixer les en-têtes de contrôle du cache dans le 304-réponse? D'après ce que je peux lire dans les spécifications, il semble que les paramètres de contrôle du cache doit être omis, et que le cache doit-il mettre en cache pour 120 nouvelles secondes automatiquement?

Était-ce utile?

La solution

En théorie, vous ne devriez pas avoir à envoyer Cache-Control pour 304 - le destinataire doit simplement continuer à utiliser les directives du cache qu'il a reçu du 200 d'origine Cependant, comme vous l'avez trouvé, dans la pratique si vous ne gardez pas l'envoi Cache-Control, les navigateurs ignorent les directives de cache que vous avez initialement envoyé, et revenir à leurs propres heuristiques par défaut.

Donc, en pratique, vous devez inclure le même Cache-Control avec un 304 que vous avec 200. Les spécifications que les mandats que vous envoyez pour un 304 si elle est différente de ce que vous avez envoyé précédemment (voir 10.3.5 304 non modifié ) - mais il ne certainement pas vous interdire de le répéter quand il est le même.

Et pour répondre spécifiquement aux points malavisées de l'autre réponse (structure) pour:

  1. faire veulent des caches intermédiaires à mettre en cache la réponse (qui est, mettre à jour leur entrée dans le cache de la ressource). Ils répondront adéquatement aux demandes des clients avec 200 ou 304, selon que le client inclus un en-tête conditionnel comme If-Modified-Since.

  2. 120 secondes ttl être rafraîchi par la 304 (de sorte que le même client ne doit pas faire une autre demande de la même ressource pendant au moins 120 secondes). Et les clients, tant qu'ils ont encore obtenu le cache de contenu, continuer à faire des demandes conditionnelles de la ressource, que vous pouvez continuer à répondre à un 304.

Autres conseils

Si je comprends bien le navigateur est en cache de fait pendant 120 secondes et que votre serveur répond 304 Non modifié à la suite If-Modified-Since demandes. Cette demande « IMS » se produit lorsque l'utilisateur final accède à la même URL. A cette époque, le navigateur peut envoyer un If-Modified-Since demande. Le navigateur veut savoir si elle affiche un contenu périmé. Cela semble normal.

Après avoir reçu cette demande votre serveur doit répondre OK 200, 304 Non modifié (ou 4XX, le cas échéant).

Je ne crois pas que vous devez configurer votre serveur pour envoyer un en-tête Cache-Control avec la réponse 304 pour deux raisons:
1. Vous ne voulez pas de caches intermédiaires à mettre en cache cette réponse 304 (il y a une possibilité qu'ils pourraient)
2. Le TTL 120 secondes ne sera pas rafraîchi par la réponse 304. Le navigateur conservera l'objet pendant 120 secondes de la réponse 200 OK. Après 120 secondes, le navigateur devrait envoyer une requête GET, pas If-Modified-Since, de sorte que votre serveur répondra avec les octets du fichier et non pas seulement une réponse 304.

Notez que le navigateur ne demandera pas à nouveau le fichier automatiquement au bout de 120 secondes à moins que l'utilisateur final, il demande expressément par une charge de page ou entrer directement l'URL dans la barre d'adresse (ou sauf si vous avez une application personnalisée qui contrôle cette fonctionnalité en quelque sorte).

Sous la direction du premier paragraphe pour lire un peu mieux (je l'espère)

scroll top