2012-04-25 13 views
113

Ho letto su Pragma intestazione Wikipedia che dice:Differenza tra intestazioni Pragma e Cache-control?

"La Pragma: no-cache campo di intestazione è un/1.0 un'intestazione HTTP destinate ad uso nelle richieste Si tratta di un mezzo per il browser. comunica al server e a tutte le cache intermedie che desidera una nuova versione della risorsa, , non per dire al browser di non memorizzare nella cache la risorsa.Alcuni agenti utente di prestano attenzione a questa intestazione nelle risposte, ma l'HTTP /1.1 RFC in particolare mette in guardia dal fare affidamento su questo comportamento. "

Ma non ho capito cosa fa? Qual è la differenza tra l'intestazione Cache-Control il cui valore è no-cache e Pragma il cui valore è anche no-cache?

risposta

132

Pragma è l'implementazione HTTP/1.0 e cache-control è l'implementazione HTTP/1.1 dello stesso concetto. Entrambi hanno lo scopo di impedire al client di memorizzare la risposta nella cache. I client precedenti potrebbero non supportare HTTP/1.1, motivo per cui tale intestazione è ancora in uso.

+22

Anche se la risposta di seguito è molto più complicata, è anche molto più corretta in base alle specifiche. 'Pragma: no-cache' è destinato a essere utilizzato solo nelle richieste (che significa" Voglio l'originale, non una copia cache ") e il suo comportamento non è specificato per le risposte. – clime

+4

'Cache-Control: no-cache' ha lo stesso significato per le richieste ma in realtà è anche definito per le risposte, che significa" Se si desidera utilizzare una copia memorizzata nella cache di questo in futuro, è necessario innanzitutto verificare che sia in corso fino ad oggi (cioè eseguire la riconvalida) ". – clime

+1

È per Cache Control, non deve essere SOLO per prevenire la cache, può anche essere usato per dire "Puoi mettere in cache questo". .... –

75

Non vi è alcuna differenza, ad eccezione del fatto che lo Pragma è definito solo come applicabile alle richieste da parte del client, mentre Cache-Control può essere utilizzato sia dalle richieste dei client sia dalle risposte dei server.

Quindi, per quanto riguarda gli standard, possono essere confrontati solo dal punto di vista del client che effettua una richiesta e il server riceve una richiesta dal client. Il http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32 definisce lo scenario come segue:

HTTP/1.1 cache dovrebbe trattare "Pragma: no-cache", come se il cliente aveva inviato "Cache-Control: no-cache". Nessuna nuova direttiva Pragma sarà definita in HTTP.

Note: because the meaning of "Pragma: no-cache as a response 
    header field is not actually specified, it does not provide a 
    reliable replacement for "Cache-Control: no-cache" in a response 

Il modo in cui avrei letto quanto sopra:

  • se si sta scrivendo un client e hanno bisogno di no-cache:

    • basta usare Pragma: no-cache nelle vostre richieste, dal momento che potrebbe non sapere se Cache-Control è supportato dal server;
    • ma nelle risposte, per decidere sull'opportunità di memorizzare nella cache, verificare la presenza di Cache-Control
  • se si sta scrivendo un server:

    • nelle richieste di analisi da parte dei clienti, verificare la presenza di Cache-Control; se non trovato, controllare Pragma: no-cache ed eseguire la logica Cache-Control: no-cache;
    • nelle risposte, fornire Cache-Control.

Naturalmente, la realtà potrebbe essere diversa da ciò che è scritto o impliciti nella RFC!

+4

Cosa succede se l'intestazione ha entrambi? 'Cache-Control: max-age = 86400' e ' Pragma: no-cache'? Quale sarà quindi onorato dai browser moderni? – PKHunter

+2

@PKHunter, perché ti preoccuperesti in quale direzione va se il comportamento non è definito? Se sei responsabile per il server, chiaramente puoi fare di meglio che fornire informazioni fuorvianti al cliente. Inoltre, come indicato nella mia risposta, il 'Pragma: no-cache' è definito solo per le richieste dal browser, e sarebbe quindi completamente non valido e indefinito nelle risposte dal server al browser, ad esempio, immagino che ogni singolo browser (sia moderno che non) dovrebbe ignorare tale intestazione in ogni risposta che potrebbe ricevere. – cnst