if-modified-since vs if-none-match


88

Quale potrebbe essere la differenza tra if-modified-since e if-none-match? Ho la sensazione che if-none-match venga utilizzato per i file mentre if-modified-since viene utilizzato per le pagine?

Risposte:


111

Per quanto riguarda le differenze tra Last-Modified/If-Modified-Sincee ETag/If-None-Match:

Entrambi possono essere usati in modo intercambiabile. Tuttavia, a seconda del tipo di risorsa e di come viene generata sul server, potrebbe essere più facile rispondere all'una o all'altra domanda ("è stata modificata da ...?" / "Corrisponde ancora a questo ETag?") .

Esempi:

  • Se stai servendo file, utilizzare i file mtimecome Last-Modifieddata è la soluzione più semplice.
  • Se stai servendo una pagina web dinamica costruita a partire da una serie di query SQL, controllare se i dati restituiti da una di queste query sono cambiati potrebbe essere poco pratico (a meno che tutte abbiano una sorta di colonna "ultima modifica"). In questo caso, usare ad esempio un hash md5 del contenuto della pagina in quanto ETagsarà molto più semplice.
    OTOH, questo significa che devi comunque generare l'intera pagina sul server, anche per un GET condizionale. Capire cosa deve entrare esattamente nell'ETag (chiavi primarie, numeri di revisione, ... ecc.) Può farti risparmiare molto tempo qui.

Vedere questi collegamenti per maggiori dettagli sull'argomento:


Ho inviato al browser un ETag, ma non richiede mai la stessa pagina con If-None-Match. Quale potrebbe essere il problema?
Pacerier

2
@pacerier: i browser non sono tenuti a utilizzare Etag. Quindi potrebbe essere un vecchio browser e semplicemente ignorarlo. L'altra possibilità è che si acceda all'entità con parametri URL che cambiano da chiamata a chiamata. Se il nome dell'entità cambia, etag non verrà utilizzato per richieste diverse.
Rafael Baptista

@RafaelBaptista Per approfondire la tua seconda metà del commento, dì che ho questa situazione: ho un file server e il server supporta il controllo delle versioni utilizzando ETag e per motivi di compatibilità con le versioni precedenti, i client usavano un parametro di query my_current_version = (versione ). Se invio una richiesta HTTP con valori variabili per my_current_version, ma anche con ETag, quale criterio, come best practice, avrà la priorità quando si determina se servire una nuova versione o inviare una 304? Grazie!
laughing_man

1
Il modo in cui il server utilizza Etag dipende dal server. Probabilmente puoi configurare la maggior parte dei file server per ignorare i parametri con etag se vuoi tramite le regole di riscrittura. Hai meno controllo sul client: il browser. La maggior parte non invierà un'intestazione etag che hanno ottenuto per un set di parametri in una richiesta per un altro. Una richiesta del client per l'immagine? V = 1 non invierà lo stesso etag per l'immagine? V = 2. Se stessi scrivendo i miei server implementerei l'etag come hash dei contenuti dell'immagine. Qualsiasi URL che richiede una risorsa e viene fornito con un'etichetta che corrisponde all'hash dell'immagine che invierei, restituisco 304.
Rafael Baptista

22

If-Modified-Sinceviene confrontata con la Last-Modified, mentre If-None-Matchviene confrontato ETag. Entrambi Modified-Sincee ETagpossono essere utilizzati per identificare una variante specifica di una risorsa.

Ma il confronto di If-Modified-Sincea Last-Modifiedti dà le informazioni se la variante memorizzata nella cache è più vecchia o più recente, mentre il confronto di If-None-Matcha ETagti dà solo le informazioni se entrambe sono identiche o meno. Inoltre, la maggior parte dei ETaggeneratori include le informazioni dell'inode specifico del sistema, quindi spostare un file su un'unità diversa potrebbe cambiare ETaganche le.


Interessante, ma perché dovrei usare controlli "identici" su controlli "ultima modifica"? Quali sono i vantaggi? Se hai un file da pubblicare, quale è l'opzione migliore?
Torre

7
Con i computer, il tempo è fragile. I secondi intercalari, la commutazione tra l'ora legale e gli orologi imprecisi possono causare un controllo "ultima modifica" per restituire il risultato sbagliato. Il confronto del contenuto stesso (o dell'hash MD5 del contenuto) evita questi problemi.
devdanke

Nonostante capisco perfettamente @devdanke, direi che il controllo del timestamp è molto più veloce del controllo di md5sum. Lo scopo di queste intestazioni è di renderlo veloce, a volte è preferibile non trasferire una nuova versione di un'entità al client piuttosto che caricare il server con l'I / O. Ad ogni modo, l'utente può sempre premere ctrl + maiusc + R (o ctrl + F5 o qualsiasi altra cosa)
Grief

13

Il valore di timestamp utilizzato in Last-Modified / If-Modified-Since ha una precisione limitata: un secondo e questo semplicemente non è sufficiente per modificare rapidamente i contenuti come, ad esempio, l'applicazione di chat Web in cui è possibile pubblicare più di un messaggio in un dato secondo . ETag / If-None-Match può aiutare a risolvere questo problema.


9

Come indicato nelle migliori pratiche di Google:

È importante specificare uno tra Expires o Cache-Control max-age e uno tra Last-Modified o ETag, per tutte le risorse memorizzabili nella cache. È ridondante specificare sia Expires che Cache-Control: max-age o specificare sia Last-Modified che ETag.

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


quell'URL non ha più un testo simile a quello. Non viene menzionata alcuna restrizione contro l'utilizzo Last-Modifiedcon ETag(o, sul lato useragent, If-Modified-Sincecon If-None-Match). Allo stesso modo le specifiche W3 non ti limitano. Dice di non usare If-Modified-Sincecon If-Match, ma presumo sia perché il set di documenti che hanno date aggiornate ma lo stesso contenuto definito dall'ETag dovrebbe essere piuttosto piccolo.
mpag


3

A meno che non sia dichiarato debole dal server, un ETag è considerato un validatore forte e può quindi essere utilizzato per soddisfare una richiesta con intervallo condizionale. Tuttavia, la maggior parte degli ETag generati automaticamente presenta difficoltà nelle situazioni di server farm, poiché spesso utilizzano informazioni inode e / o un contatore persistente univoco. In pratica, ho trovato che l'intestazione Last Modified è sufficiente per contenuti abbastanza statici, ad esempio per fornire contenuto statico protetto, poiché il tempo di scrittura del file è un validatore ragionevolmente buono.

L'ETag è di gran lunga il più flessibile. I client conformi devono inviare l'ETag in una richiesta condizionale, mentre DOVREBBERO inviarli entrambi se disponibili.


0

L'intestazione If-Modified-Since viene utilizzata per specificare l'ora in cui il browser ha ricevuto l'ultima volta la risorsa richiesta. L'intestazione If-None-Match viene utilizzata per specificare il tag di entità che il server ha emesso con la risorsa richiesta l'ultima volta che è stata ricevuta.

Nei due modi descritti, queste intestazioni vengono utilizzate per supportare la memorizzazione nella cache del contenuto all'interno del browser e consentono al server di istruire il browser a utilizzare una copia cache di una risorsa, piuttosto che rispondere con l'intero contenuto della risorsa se questo è non necessario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.