¿Diferencia entre los encabezados Pragma y Cache-Control?

166

Leí sobre el encabezado de Pragma en Wikipedia que dice:

"El campo de encabezado Pragma: no-cache es un encabezado HTTP / 1.0 destinado a usarse en solicitudes. Es un medio para que el navegador le diga al servidor y a cualquier caché intermedia que quiere una versión nueva del recurso, no para el servidor para decirle al navegador que no almacene en caché el recurso. Algunos agentes de usuario prestan atención a este encabezado en las respuestas, pero el RFC HTTP / 1.1 advierte específicamente contra confiar en este comportamiento ".

¿Pero no he entendido lo que hace? ¿Cuál es la diferencia entre el Cache-Controlencabezado cuyo valor es no-cachey Pragmacuyo valor también es no-cache?

saplingPro
fuente

Respuestas:

196

Pragmaes la implementación HTTP / 1.0 y cache-controles la implementación HTTP / 1.1 del mismo concepto. Ambos están destinados a evitar que el cliente almacene en caché la respuesta. Es posible que los clientes más antiguos no admitan HTTP / 1.1, por lo que ese encabezado todavía está en uso.

Eric Brenden
fuente
31
Aunque la respuesta de cnst a continuación es mucho más complicada, también es mucho más correcta según la especificación. Pragma: no-cacheestá destinado a usarse solo en solicitudes (que significa "Quiero el original, no una copia en caché") y su comportamiento no se especifica para las respuestas.
Clima
55
Cache-Control: no-cachetiene el mismo significado para las solicitudes, pero en realidad también se define para las respuestas, lo que significa "Si desea utilizar una copia en caché de esto en el futuro, primero debe verificar conmigo que está actualizado (es decir, realizar la revalidación)".
Clima
3
Es para el control de la memoria caché, no tiene que ser SOLO para prevenir la memoria caché, también se puede usar para decir "Puede almacenar esto en la memoria caché". ....
jave.web
Respuesta básica. Para hacerlo más complicado: también es un encabezado de solicitud, lo que significa que también puede enviar sin caché al servidor. Y eso en realidad podría significar devolver contenido obsoleto a los clientes, ¿QUÉ? Ahora olvida esto y lee la respuesta simple anterior y disfruta de tu vida, no lo
entiendas
Ambos están destinados a evitar que el cliente almacene en caché la respuesta, es una nota confusa para los lectores. También puede tener max-ageque no impide el almacenamiento en caché. Simplemente establece una fecha de vencimiento para ella ...
Honey
97

No hay diferencia, excepto que Pragmasolo se define como aplicable a las solicitudes del cliente, mientras que Cache-Controlpuede ser utilizado tanto por las solicitudes de los clientes como por las respuestas de los servidores.

Por lo tanto, en lo que respecta a los estándares, solo se pueden comparar desde la perspectiva del cliente que realiza una solicitud y el servidor recibe una solicitud del cliente. El http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32 define el escenario de la siguiente manera:

Los cachés HTTP / 1.1 DEBEN tratar "Pragma: no-cache" como si el cliente hubiera enviado "Cache-Control: no-cache". No se definirán nuevas directivas de Pragma en 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

La forma en que leería lo anterior:

  • si estás escribiendo un cliente y necesitas no-cache:

    • simplemente utilícelo Pragma: no-cacheen sus solicitudes, ya que es posible que no sepa si Cache-Controles compatible con el servidor;
    • pero en las respuestas, para decidir si almacenar en caché, verifique Cache-Control
  • si estás escribiendo un servidor:

    • al analizar las solicitudes de los clientes, verifique Cache-Control; si no se encuentra, verifique Pragma: no-cachey ejecute la Cache-Control: no-cachelógica;
    • en respuestas, proporcionar Cache-Control.

¡Por supuesto, la realidad puede ser diferente de lo que está escrito o implícito en el RFC!

cnst
fuente
55
¿Qué pasa si el encabezado tiene ambos? Cache-Control: max-age=86400y Pragma: no-cache? ¿Cuál será honrado por los navegadores modernos?
PKHunter
3
@PKHunter, ¿por qué te importaría en qué dirección va si el comportamiento no está definido? Si usted es responsable del servidor, claramente puede hacerlo mejor que dar información engañosa al cliente. Además, como señalé en mi respuesta, Pragma: no-cachesolo se define para las solicitudes del navegador, por lo que sería completamente inválido e indefinido en las respuestas del servidor al navegador, por ejemplo, me imagino que cada navegador (ya sea moderno o no) debe ignorar dicho encabezado en cualquier respuesta que pueda recibir.
cnst
3
Un navegador moderno debe ignorar el Pragma a favor de Cache-Control si ambos están presentes porque este último puede especificar períodos de tiempo y otra información que no estaba disponible en el protocolo inicial 1.0.
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          |

Si es después de 1999, y todavía estás usando Expires o Pragma , lo estás haciendo mal.

Te estoy mirando 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: Pragmaes un legado de HTTP / 1.0 y no se ha necesitado desde Internet Explorer 5 o Netscape 4.7. A menos que espere que algunos de sus usuarios usen IE5: es seguro dejar de usarlo.


  • Caduca: [date] (en desuso - HTTP 1.0)
  • Pragma: sin caché (en desuso - HTTP 1.0)
  • Control de caché: max-age =[seconds]
  • Control de caché : sin caché (debe volver a validar la copia en caché cada vez)

Y las solicitudes condicionales:

  • Solicitudes condicionales basadas en Etag (etiqueta de entidad)
    • Servidor: Etag: W/“1d2e7–1648e509289”
    • Cliente: If-None-Match: W/“1d2e7–1648e509289”
    • Servidor: 304 Not Modified
  • Solicitudes condicionales basadas en fechas modificadas
    • Servidor: last-modified: Thu, 09 May 2019 19:15:47 GMT
    • Cliente: If-Modified-Since: Fri, 13 Jul 2018 10:49:23 GMT
    • Servidor: 304 Not Modified

última modificación: jue, 09 de mayo de 2019 19:15:47 GMT

Ian Boyd
fuente
2
El RFC dice que debe usarlos en caso de que un cliente no sea compatible con Cache-Control: tools.ietf.org/html/rfc7234#page-29
Randall Borck
3
El cliente "debería" incluir ambos, a menos que quiera tratar los servidores de almacenamiento en caché HTTP / 1.1 y HTTP / 1.0 de manera diferente. El servidor no debe incluir Pragmaen absoluto. (En HTTP / 1.0, Pragma se definió como un campo extensible para directivas de implementación especificadas para destinatarios. Esta especificación desprecia esas extensiones para mejorar la interoperabilidad.)
Ian Boyd,
2
Desde el punto de vista de la seguridad, se recomienda usarlo. Muchos navegadores siguen la directiva pragma: no-cache, por lo que se recomienda usarlo por OWASP: owasp.org/index.php/…
Randall Borck
2
@RandallBorck: Estás difundiendo información obsoleta (¡por dos décadas, nada menos!). Ya no hay navegadores que sigan la directiva Pragma, a menos que sea 1999. Este es un consejo de culto de carga: "no duele y siempre lo hemos hecho, por lo tanto es bueno y necesario".
Piskvor salió del edificio el
2
@Piskvor La mayoría de los servidores aún son compatibles con 1.0 y 1.1, por lo que, a menos que bloquee activamente las solicitudes HTTP / 1.0, no elija qué protocolo está utilizando el cliente. La mayoría de los desarrolladores de hoy no se molestan en bloquear 1.0, por lo tanto, sigue siendo una práctica recomendada, incluso en 2019.
Randall Borck