Frage

Ich habe versucht, dies zu verstehen, und suchte SO für ähnliche Fragen, aber ich immer noch nicht habe ein 100% Verständnis darüber, wie diese funktionieren soll.

Ich erhalte diese Antwort auf eine Anfrage für eine Bildressource:

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

Das gewünschte Verhalten ist, dass der Client diese für 120 Sekunden zwischenspeichern soll, dann erneut vom Server anfordern. Innerhalb der 120 Sekunden wird keine Anfrage an den Server gesendet.

Dann wird nach 120 Sekunden wird eine Anforderung gesendet und eine Antwort empfangen wird 304:

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

Bisher alles gut. Aber dann auf der nächsten Anfrage (whithin 120 Sekunden) Ich hätte gedacht, dass die Ressource für 120 neue Sekunden zwischengespeichert werden soll. Was ich sehe im Browser (Firefox) auf der anderen Seite, ist, dass es von diesem Zeitpunkt an immer die Ressource anfordern und erhält die 304-Antwort.

Am I sollte den Cache-Control-Header in der 304-Antwort befestigen? Von dem, was ich in der Spezifikation lesen kann, scheint es, wie die Cache-Control-Einstellungen verzichtet werden soll, und dass der Cache sollte es automatisch für 120 neue Sekunden zwischenspeichern?

War es hilfreich?

Lösung

In der Theorie sollten Sie nicht für einen 304 haben Cache-Control senden - der Empfänger sollte nur weiterhin die Cache-Richtlinien verwenden, dass es von den ursprünglichen 200 jedoch erhalten, wie Sie gefunden haben, wenn Sie in der Praxis nicht hält Cache-Control sendet, Browser die Cache-Anweisungen ignoriert, dass Sie geschickt ursprünglich, und kehrt auf ihren eigenen Standard Heuristiken.

So in der Praxis sollten Sie den gleichen Cache-Control enthalten mit 304, Sie würden mit einem 200. Die spec nur Mandate, dass Sie es für ein 304 senden, wenn es anders ist als das, was Sie vorher gesendet (siehe 10.3.5 304 nicht geändert ) - aber es ist nicht sicher tut verbieten Sie es zu wiederholen, wenn es das gleiche.

zu legen und insbesondere auf die verqueren Punkte von der anderen Antwort (Struktur):

  1. Sie tun wollen Vermittler Caches die Antwort zwischenzuspeichern (das heißt, aktualisieren ihre Cache-Eintrag für die Ressource). Sie werden entsprechend reagieren auf Anfragen von Kunden mit einem 200 oder 304, je nachdem, ob der Client enthalten einen bedingten Header wie If-Modified-Since.

  2. Die 120-Sekunden-ttl wird durch den 304 aufgefrischt werden (so der gleiche Client keine andere Anforderung für die gleiche Ressource für mindestens weitere 120 Sekunden machen sollte). Und Kunden, solange sie haben immer noch den Inhalt zwischengespeichert bekamen, wird weiter bedingte Anforderungen für die Ressource machen, die Sie reagieren auf mit einem 304 fortgesetzt werden können.

Andere Tipps

RFC7232 Updates RFC2616 zu sagen:

  

Der Server hat eine 304-Antwort zu erzeugen muss eine der Erzeugung      Folgende Header-Felder, die in einem 200 (OK) gesendet worden wären,      Antwort auf die gleiche Anfrage: Cache-Control, Content-Location, Datum,      ETag, Ablaufdatum und Vary.

Wenn ich das richtig verstehe, dann ist der Browser in der Tat Caching für 120 Sekunden und den Server reagiert 304 auf nachfolgende Not Modified If-Modified-Since-Anfragen. Dieses „IMS“ Anforderung tritt auf, wenn der Endbenutzer die gleiche URL zugreift. Zu dieser Zeit kann der Browser eine If-Modified-Since-Anfrage schicken. Der Browser will wissen, ob es veraltete Inhalte anzeigt. Dies scheint normal.

Auf dieser Anfrage den Server erhalten, sollte 200 OK antworten, 304 nicht geändert (oder ein 4XX-, falls erforderlich).

Ich glaube nicht, dass Sie Ihren Server einen Cache-Control-Header mit der 304-Antwort aus zwei Gründen senden setzen sollen
1. Sie wollen keine Vermittler Caches Cache, dass 304 Antwort (eine Möglichkeit besteht, dass sie konnten)
2. Die 120 Sekunden TTL wird nicht durch die 304-Antwort aktualisiert. Der Browser wird das Objekt für 120 Sekunden von der 200 OK-Antwort erhalten. Nach 120 Sekunden werden der Browser sollte eine GET-Anfrage senden, keine If-Modified-Since, so dass Ihr Server mit dem Bytes der Datei reagiert und nicht nur eine 304-Antwort.

Beachten Sie, dass der Browser die Datei nicht erneut anfordern wird automatisch nach 120 Sekunden, wenn die Endbenutzer speziell es über eine Seite zu laden anfordert oder direkt die URL in ihre Adressleiste eingeben (oder, wenn Sie eine benutzerdefinierte Anwendung haben, dass die Kontrollen, dass Funktionalität irgendwie).

Edited der erste Absatz besser ein wenig zu lesen (hoffentlich)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top