2012-07-06 16 views
42

Qual è la differenza tra Expires: 0 e Expires: -1 nell'intestazione della risposta HTTP? RFC 2616 definisce i formati di data non valida , incluso in particolare il valore "0" come già scaduto. Tuttavia, alcuni server (ad esempio www.google.de) rispondono con Expires: -1.HTTP scade i valori di intestazione "0" e "-1"

C'è un vantaggio rispetto all'utilizzo di -1 su 0 o è addirittura necessario per alcuni client HTTP danneggiati?

+4

Non definisce '" 0 "' come "già scaduto" - definisce "formati di data non validi", * incluso * '" 0 "', come "già scaduto" –

+0

Questo è corretto, grazie per questo suggerimento. Ma mi sembra che "0" dovrebbe essere preferito quando si specifica un "formato di data non valido". – scai

+2

No, la preferenza (espressa nel paragrafo successivo) è quella di utilizzare un formato data valido, contenente lo stesso valore dell'intestazione 'Date', per indicare che è già scaduto. –

risposta

29

Il problema è in come l'intestazione di Expires viene elaborata da Internet Explorer (in particolare le versioni precedenti). IE utilizza il motore di layout Trident e l'API WinINET per elaborare le richieste HTTP. Come forse sapete Scade potrebbe essere specificato nell'intestazione HTTP

Expires: 0 

o in meta tag

<meta http-equiv="Expires" content="0"> 

Nel secondo caso, Scade entrò a far parte del contenuto della risposta (non intestazione contenuto), quindi sarà processed by Trident and then propagated to WinINET:

Se WinINET downloads una risposta con un invalido Expires (ad es uno che non contenga un valore HTTPDATE valido) e nessun altro caching , segnerà il documento come scaduto un'ora fa. Trident, tuttavia, non ha una tale logica. Se si specifica un orario non valido, Trident acquisisce il timestamp corrente e lo utilizza come scadenza. Trident utilizzerà anche il timestamp corrente se incontra la direttiva Pragma: no-cache. Se l'utente tenta di reindirizzare il documento corrente durante lo stesso secondo esatto in cui l'HTTP/404 è stato elaborato, la scadenza errata aggiornata della voce esistente della cache provocherà il trattamento come nuova per quella richiesta. Se l'utente preme il pulsante Aggiorna o F5, la cache viene ignorata e verrà visualizzata la pagina 404.

In altre parole Expires: 0 porta non sempre a scadenza immediata delle risorse, pertanto dovrebbero essere evitati e Expires: [some valid date in the past] dovrebbe essere usato al posto.

+1

Questa è la risposta "un client HTTP non funzionante" che stavo aspettando e spiega il motivo di "Scade: -1", grazie! :) – scai

+9

3 voti positivi? Qualcuno ha persino letto la risposta? Secondo l'articolo, non c'è * nessuna differenza * tra "Scadenza: -1" e "Scadenza: 0". – user123444555621

+4

Questo è corretto. L'articolo spiega solo una gestione errata * Expires = 0 * nel meta elemento HTML. Non una sola parola su * Expires = -1 * o altri valori Expires gestiti in modo errato nell'intestazione HTTP. – scai

8

Scade: -1 L'intestazione Scadenza specifica quando il contenuto deve essere considerato non aggiornato. Il valore -1 indica che il contenuto scade immediatamente e dovrebbe essere richiesto nuovamente prima di essere nuovamente visualizzato. http://www.httpwatch.com/httpgallery/headers/

max-age = 0 semplicemente racconta cache (e agenti utente) la risposta è viziata dal get-go e quindi dovrebbero rinnovare la risposta (ad es. Con l'intestazione If-Not-Modified) prima di usare un copia cache, mentre no-cache dice loro DEVE riconvalidare prima di usare una copia cache.

per ulteriori informazioni guardare in http://www.w3.org/Protocols/HTTP/1.1/rfc2616.pdf

+2

Grazie, ma la mia domanda riguarda specificamente la differenza tra "Scade: 0" e "Scade: -1". – scai

+0

+1 Anche se non è davvero una risposta alla domanda, ma è rilevante per l'argomento. Mi sembra che se stai cercando di aggiungere scade: -1 o 0 probabilmente userai anche il max-age = 0. Probabilmente avrebbe dovuto essere un commento piuttosto che una risposta. –

1

Utilizzando "-1" non è valido, e sarebbe stato trattato come "0". Non dovrebbe innescare una ricarica.

Attenzione: in alcuni browser potrebbe essere necessario 1 ora in più o utilizzare il tempo di scadenza predefinito per l'incasso.

1- Quindi meglio dare una data di vecchia corretta come:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> 
<meta http-equiv="Pragma" content="no-cache" /> 
<meta http-equiv="Expires" content="Tue, 01 Jan 1980 1:00:00 GMT" /> 

Per il lavoro formale, consiglio che per dare l'ora data corrente a meta Scade invece di utilizzare Vecchio data fissa (che farà motori di ricerca come google contrassegnano il vostro sito come vecchio e non essere visualizzati sul toppers)

2- se il backend PHP si può fare con le cose come:

<meta http-equiv="Expires" content="<?php echo gmdate('D, d M Y H:i:s', time()-3600) . ' GMT' ?>" /> 

PS: io do un'ora prima solo per in caso.

Problemi correlati