Domanda

Ho cercato di capire questo, e cercato SO domande simili, ma io ancora non avere una comprensione del 100% su come questo dovrebbe funzionare.

ottengo questa risposta ad una richiesta di una risorsa immagine:

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

Il comportamento desiderato è che il client deve memorizzare nella cache questo per 120 secondi, quindi richiedere dal server di nuovo. Entro i 120 secondi, nessuna richiesta viene inviata al server.

Poi, dopo 120 secondi, viene inviata una richiesta e una risposta 304 è stata ricevuta:

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

Finora, tutto bene. Ma poi, per la richiesta successiva (whithin 120 secondi) avrei pensato che la risorsa deve essere memorizzato nella cache per 120 nuovi secondi. Quello che vedo nel browser (Firefox) d'altra parte, è che da questo punto in poi richiedere sempre la risorsa e riceve il 304-risposta.

Dovrei attaccare le intestazioni cache-control nel 304-risposta? Da quello che posso leggere nelle specifiche, sembra che le impostazioni di cache-controllo deve essere omesso, e che la cache deve memorizzare nella cache per 120 nuovi secondi automaticamente?

È stato utile?

Soluzione

In teoria non si dovrebbe avere per inviare Cache-Control per un 304 - il destinatario deve solo continuare a utilizzare le direttive della cache che ha ricevuto dall'originale 200. Tuttavia, come hai trovato, in pratica se si non tenere l'invio di cache-Control, i browser ignoreranno le direttive della cache che vi ha mandati in origine, e ripristinare i propri euristica di default.

Quindi, in pratica, è necessario includere la stessa Cache-Control con una 304 che si farebbe con un 200. Lo spec mandati solo che inviarlo per un 304 se è diverso da quello che è stato inviato in precedenza (vedi 10.3.5 304 Not Modified ) - ma di certo non lo fa si vieta di ripetere quando è lo stesso.

E per rispondere in modo specifico ai punti nella direzione sbagliata dalla altra risposta (la struttura di):

  1. do vogliono cache intermedi per memorizzare nella cache la risposta (cioè, aggiornare la loro voce di cache per la risorsa). Essi potranno rispondere in modo adeguato alle richieste dei clienti con un 200 o un 304, a seconda che il cliente ha incluso un'intestazione condizionale come If-Modified-Since.

  2. Il 120 secondi ttl si essere rinfrescati dalla 304 (in modo che il cliente stesso non dovrebbe fare una nuova richiesta per la stessa risorsa per almeno altri 120 secondi). E i clienti, fino a quando hanno ancora ottenuto la cache contenuti, continuano a fare richieste condizionali per la risorsa, che è possibile continuare a rispondere con un 304.

Altri suggerimenti

RFC7232 aggiornamenti RFC2616 dire:

  

Il server di generare una risposta 304 deve generare una delle      i seguenti campi di intestazione che sarebbero stati inviati in un 200 (OK)      risposta alla stessa richiesta: Cache-Control, Content-Location, data,      ETag, scade, e Vary.

Se ho capito bene, allora il browser è in realtà la memorizzazione nella cache per 120 secondi e il server sta rispondendo 304 Non modificato per la successiva If-Modified-Since richieste. Questa richiesta "IMS" si verifica quando l'utente finale accede allo stesso URL. A quel tempo il browser può inviare una If-Modified-Since richiesta. Il browser vuole sapere se si sta visualizzando il contenuto stantio. Questo sembra normale.

Dopo aver ricevuto questa richiesta il server dovrebbe rispondere OK 200, 304 Non modificato (o un 4XX, se necessario).

Non credo che si dovrebbe impostare il server per inviare un'intestazione Cache-Control con la risposta 304 per due motivi:
1. Se non si desidera alcun cache intermedi di cache che 304 risposta (v'è la possibilità che potevano)
2. La 120 secondo TTL non verrà aggiornata dalla risposta 304. Il browser manterrà l'oggetto per 120 secondi dalla risposta 200 OK. Dopo 120 secondi il navigatore web dovrebbe invia una richiesta GET, non un If-Modified-Since, in modo che il server risponderà con i byte del file e non solo una risposta 304.

Si noti che il browser non richiedere il file automaticamente dopo 120 secondi a meno che l'utente finale specifico lo richiede tramite un caricamento della pagina o inserendo direttamente l'URL nella barra degli indirizzi (o se non si dispone di un'applicazione personalizzata che controlla tale funzionalità in qualche modo).

A cura del primo paragrafo di leggere un po 'meglio (si spera)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top