Differenza tra le intestazioni Pragma e Cache-Control?


166

Ho letto dell'intestazione di Pragma su Wikipedia che dice:

"Il campo di intestazione Pragma: no-cache è un'intestazione HTTP / 1.0 destinata all'uso nelle richieste. È un mezzo per consentire al browser di comunicare al server e alle cache intermedie che desidera una nuova versione della risorsa, non per il server per dire al browser di non memorizzare nella cache la risorsa. Alcuni agenti utente prestano attenzione a questa intestazione nelle risposte, ma la RFC HTTP / 1.1 avverte specificamente di non fare affidamento su questo comportamento. "

Ma non ho capito cosa fa? Qual è la differenza tra l' Cache-Controlintestazione il cui valore è no-cachee il Pragmacui valore è anche no-cache?

Risposte:


196

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


31
Sebbene la risposta del cnst di seguito sia 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

5
Cache-Control: no-cacheha lo stesso significato per le richieste ma in realtà è anche definito per le risposte, il che significa "Se si desidera utilizzare una copia cache di questo in futuro, è necessario prima verificare con me che sia aggiornato (ovvero eseguire la riconvalida)".
clime

3
È per il controllo della cache, non deve essere SOLO per la prevenzione della cache, ma può anche essere usato per dire "Puoi memorizzare nella cache". ....
jave.web,

Risposta di base. Per renderlo più complicato: è anche un'intestazione di richiesta che significa che è possibile inviare anche no-cache al server. E questo in realtà potrebbe significare restituire contenuti non aggiornati ai clienti, COSA ?? Ora te lo dimentichi e leggi la semplice risposta sopra e goditi la vita, non scavare troppo forte lol
sotn

Entrambi hanno lo scopo di impedire al client di memorizzare nella cache la risposta è una nota confusa per i lettori. Può anche avere max-ageche non impedisce la memorizzazione nella cache. Stabilisce solo una data di scadenza per questo ...
Miele

97

Non vi è alcuna differenza, ad eccezione del fatto che Pragmaè definito come applicabile solo alle richieste dal client, mentre Cache-Controlpuò essere utilizzato sia dalle richieste dei client che 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 del server che riceve una richiesta dal client. Il http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32 definisce lo scenario come segue:

Le cache HTTP / 1.1 DOVREBBE trattare "Pragma: no-cache" come se il client avesse 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 vorrei leggere quanto sopra:

  • se stai scrivendo un cliente e hai bisogno di no-cache:

    • utilizzalo Pragma: no-cachenelle tue richieste, poiché potresti non sapere se Cache-Controlè supportato dal server;
    • ma nelle risposte, per decidere se memorizzare nella cache, controllare Cache-Control
  • se stai scrivendo un server:

    • nell'analisi delle richieste dei clienti, controllare Cache-Control; se non trovato, verificare Pragma: no-cacheed eseguire la Cache-Control: no-cachelogica;
    • nelle risposte, fornire Cache-Control.

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


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

3
@PKHunter, perché dovresti preoccuparti di come va se il comportamento non è definito? Se sei responsabile del server, chiaramente puoi fare di meglio che fornire al cliente informazioni fuorvianti. Inoltre, come indicato nella mia risposta, Pragma: no-cacheè definito solo per le richieste dal browser, e sarebbe quindi del tutto invalido e indefinito nelle risposte dal server al browser, ad esempio, immagino che ogni singolo browser (moderno o non) dovrebbe ignorare tale intestazione in qualsiasi risposta possa ricevere.
primo

3
Un browser moderno dovrebbe ignorare Pragma a favore di Cache-Control se entrambi sono presenti perché quest'ultimo può specificare periodi di tempo e altre informazioni che non erano disponibili nel protocollo 1.0 iniziale.
Randall Borck,

17
| Stop using          | Replaced with                    |
| (HTTP 1.0)          | (HTTP 1.1 - 1999)                |
|---------------------|----------------------------------|
| Expires: [date]     | Cache-Control: max-age=[seconds] |
| Pragma: no-cache    | Cache-Control: no-cache          |

Se è dopo il 1999 e stai ancora utilizzando Expires o Pragma , stai sbagliando.

Ti sto guardando Stackoverflow:

200 OK
Pragma: no-cache
Content-Type: application/json
X-Frame-Options: SAMEORIGIN
X-Request-Guid: a3433194-4a03-4206-91ea-6a40f9bfd824
Strict-Transport-Security: max-age=15552000
Content-Length: 54
Accept-Ranges: bytes
Date: Tue, 03 Apr 2018 19:03:12 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-yyz8333-YYZ
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1522782193.766958,VS0,VE30
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Cache-Control: private

tl; dr: Pragmaè un lascito di HTTP / 1.0 e non è più necessario da Internet Explorer 5 o Netscape 4.7. A meno che non ti aspetti che alcuni dei tuoi utenti utilizzino IE5: è sicuro smettere di usarlo.


  • Scadenza: [date] (obsoleto - HTTP 1.0)
  • Pragma: no-cache (obsoleto - HTTP 1.0)
  • Controllo cache: età massima =[seconds]
  • Controllo cache: nessuna cache (deve riconvalidare la copia cache ogni volta)

E le richieste condizionali:

  • Richieste condizionali basate su Etag (tag entità)
    • Server: Etag: W/“1d2e7–1648e509289”
    • Cliente: If-None-Match: W/“1d2e7–1648e509289”
    • Server: 304 Not Modified
  • Richieste condizionate basate sulla data modificate
    • Server: last-modified: Thu, 09 May 2019 19:15:47 GMT
    • Cliente: If-Modified-Since: Fri, 13 Jul 2018 10:49:23 GMT
    • Server: 304 Not Modified

ultima modifica: gio, 09 maggio 2019 19:15:47 GMT


2
La RFC dice che dovresti usarli entrambi nel caso in cui un client non supporti Cache-Control: tools.ietf.org/html/rfc7234#page-29
Randall Borck

3
Il client "dovrebbe" includere entrambi - a meno che non voglia trattare i server di cache HTTP / 1.1 e HTTP / 1.0 in modo diverso. Il server non dovrebbe includere Pragmaaffatto. (In HTTP / 1.0, Pragma è stato definito come un campo estensibile per le direttive specificate dall'implementazione per i destinatari. Questa specifica deprezza tali estensioni per migliorare l'interoperabilità.)
Ian Boyd,

2
Dal punto di vista della sicurezza, si consiglia di utilizzarlo. Molti browser seguono la direttiva pragma: no-cache, quindi si consiglia di usarlo da OWASP: owasp.org/index.php/…
Randall Borck

2
@RandallBorck: stai diffondendo informazioni obsolete (entro due decenni, non meno!). Nessun browser segue più la direttiva Pragma, a meno che non sia il 1999. Questo è un consiglio di culto: "non fa male e l'abbiamo sempre fatto, quindi è buono e necessario".
Piskvor lasciò l'edificio il

2
@Piskvor La maggior parte dei server supporta ancora sia 1.0 che 1.1, quindi a meno che non si blocchi attivamente le richieste HTTP / 1.0 non si sceglie quale protocollo il client sta usando. La maggior parte degli sviluppatori oggi non si preoccupa di bloccare 1.0, quindi è ancora una buona pratica, anche nel 2019.
Randall Borck
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.