Differenza tra intestazioni Pragma e Cache-Control?

Ho letto sull’intestazione di Pragma su Wikipedia che dice:

“Il campo Pragma: no-cache header è un’intestazione HTTP / 1.0 pensata per essere utilizzata nelle richieste: è un mezzo per indicare 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 l’RFC HTTP / 1.1 in particolare avvisa di non fare affidamento su questo comportamento. ”

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

Pragma è l’implementazione HTTP / 1.0 e il 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.

Non vi è alcuna differenza, ad eccezione del fatto che Pragma viene definito come applicabile alle richieste 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. http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32 definisce lo scenario come segue:

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 client e hai bisogno di no-cache :

    • usa semplicemente Pragma: no-cache nelle tue richieste, poiché potresti non sapere se Cache-Control è supportato dal server;
    • ma nelle risposte, per decidere se mettere in cache, controllare per Cache-Control
  • se stai scrivendo un server:

    • nell’analisi delle richieste dai client, controllare Cache-Control ; se non trovato, controlla Pragma: no-cache ed esegui Cache-Control: no-cache logic;
    • nelle risposte, fornire Cache-Control .

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

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

Se è dopo il 1999 e continui a utilizzare 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’eredità di HTTP / 1.0 e non è stato necessario da Internet Explorer 5 o Netscape 4.7.