Diferença entre os cabeçalhos Pragma e Cache-Control?

166

Eu li sobre o cabeçalho do Pragma na Wikipedia, que diz:

"O campo Pragma: no-cache header é um cabeçalho HTTP / 1.0 destinado a ser usado em solicitações. É um meio para o navegador informar ao servidor e todos os caches intermediários que deseja uma versão nova do recurso, não para o servidor para informar ao navegador para não armazenar em cache o recurso. Alguns agentes do usuário prestam atenção a esse cabeçalho nas respostas, mas a RFC HTTP / 1.1 adverte especificamente contra a dependência desse comportamento. "

Mas eu não entendi o que faz? Qual é a diferença entre o Cache-Controlcabeçalho cujo valor é no-cachee Pragmacujo valor também é no-cache?

saplingPro
fonte

Respostas:

196

Pragmaé a implementação HTTP / 1.0 e cache-controlé a implementação HTTP / 1.1 do mesmo conceito. Ambos têm como objetivo impedir que o cliente armazene em cache a resposta. Clientes mais antigos podem não suportar HTTP / 1.1 e é por isso que esse cabeçalho ainda está em uso.

Eric Brenden
fonte
31
Embora a resposta do cnst abaixo seja muito mais complicada, ela também é muito mais correta de acordo com a especificação. Pragma: no-cachedestina-se a ser usado apenas em solicitações (significando "Quero o original, não uma cópia em cache") e seu comportamento não é especificado para respostas.
clime
5
Cache-Control: no-cachetem o mesmo significado para solicitações, mas na verdade também é definido para respostas, significando "Se você deseja usar uma cópia em cache disso no futuro, primeiro verifique comigo se está atualizado (ou seja, execute a revalidação)".
clime
3
É para controle de cache, não precisa ser APENAS para prevenção de cache, também pode ser usado para dizer "Você pode armazenar isso em cache". ....
jave.web
Resposta básica. Para ficar mais complicado: também é um cabeçalho de solicitação, o que significa que você também pode enviar sem cache para o servidor. E isso realmente significa devolver conteúdo obsoleto aos clientes, O QUE ?? Agora você se esquece disso e lê a resposta simples acima e aproveita sua vida, não faça coisas muito
engraçadas
Ambos têm como objetivo impedir que o cliente armazene em cache a resposta é uma nota confusa para os leitores. Também pode ter o max-ageque não impede o armazenamento em cache. Ele apenas define uma data de expiração para ele ...
Mel
97

Não há diferença, exceto que ela Pragmaé definida apenas como aplicável às solicitações do cliente, enquanto que Cache-Controlpode ser usada tanto pelas solicitações dos clientes quanto pelas respostas dos servidores.

Portanto, no que diz respeito aos padrões, eles só podem ser comparados da perspectiva do cliente fazendo uma solicitação e do servidor recebendo uma solicitação do cliente. O http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32 define o cenário da seguinte maneira:

Caches HTTP / 1.1 devem tratar "Pragma: no-cache" como se o cliente tivesse enviado "Cache-Control: no-cache". Nenhuma nova diretiva Pragma será definida no 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

Da maneira que eu leria o acima:

  • se você estiver escrevendo um cliente e precisar no-cache:

    • basta usar Pragma: no-cacheem suas solicitações, pois você pode não saber se Cache-Controlé suportado pelo servidor;
    • mas nas respostas, para decidir se deve armazenar em cache, verifique Cache-Control
  • se você estiver escrevendo um servidor:

    • ao analisar solicitações dos clientes, verifique Cache-Control; se não for encontrado, verifique Pragma: no-cachee execute a Cache-Control: no-cachelógica;
    • em respostas, forneça Cache-Control.

Obviamente, a realidade pode ser diferente do que está escrito ou implícito na RFC!

cnst
fonte
5
E se o cabeçalho tiver ambos? Cache-Control: max-age=86400e Pragma: no-cache? Qual deles será homenageado pelos navegadores modernos?
PKHunter
3
@PKHunter, por que você se importaria com o rumo que o comportamento é indefinido? Se você é responsável pelo servidor, claramente pode fazer melhor do que fornecer informações enganosas ao cliente. Além disso, como apontado na minha resposta, o Pragma: no-cacheé definido apenas para solicitações do navegador e, portanto, seria totalmente inválido e indefinido nas respostas do servidor ao navegador; por exemplo, eu imagino que todos os navegadores (modernos ou not) deve ignorar esse cabeçalho em qualquer resposta que possa receber.
cnst
3
Um navegador moderno deve ignorar o Pragma em favor do Controle de Cache, se ambos estiverem presentes, porque este último pode especificar períodos de tempo e outras informações que não estavam disponíveis no protocolo 1.0 inicial.
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 for depois de 1999, e você ainda estiver usando Expires ou Pragma , estará fazendo errado.

Estou olhando para você 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é um legado do HTTP / 1.0 e não é necessário desde o Internet Explorer 5 ou Netscape 4.7. A menos que você espere que alguns de seus usuários usem o IE5: é seguro parar de usá-lo.


  • Expira: [date] (descontinuado - HTTP 1.0)
  • Pragma: sem cache (descontinuado - HTTP 1.0)
  • Controle de cache: idade máxima =[seconds]
  • Controle de cache : sem cache (deve validar novamente a cópia em cache todas as vezes)

E os pedidos condicionais:

  • Solicitações condicionais baseadas em etag (tag de entidade)
    • Servidor: Etag: W/“1d2e7–1648e509289”
    • Cliente: If-None-Match: W/“1d2e7–1648e509289”
    • Servidor: 304 Not Modified
  • Solicitações condicionais baseadas em data modificada
    • 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 modificação: qui, 09 maio 2019 19:15:47 GMT

Ian Boyd
fonte
2
O RFC diz que você deve usá-los tanto no caso de um cliente não suporta Cache-Control: tools.ietf.org/html/rfc7234#page-29
Randall Borck
3
O cliente "deve" incluir ambos - a menos que queira tratar os servidores de cache HTTP / 1.1 e HTTP / 1.0 de maneira diferente. O servidor não deve incluir Pragmanada. (Em HTTP / 1.0, Pragma foi definida como uma área extensível para directivas especificado-implementação para destinatários Esta especificação deprecates tais extensões para melhorar a interoperabilidade..)
Ian Boyd
2
Do ponto de vista de segurança, é recomendável usá-lo. Muitos navegadores seguir o Pragma: no-cache directiva, por isso é aconselhável usá-lo pela OWASP: owasp.org/index.php/...
Randall Borck
2
@RandallBorck: Você está espalhando informações desatualizadas (por duas décadas, nada menos!). Nenhum navegador segue a diretiva Pragma, a menos que seja 1999. Este é um conselho de culto à carga: "não dói e sempre o fizemos, portanto é bom e necessário".
Piskvor saiu do prédio 5/03/19
2
@Piskvor A maioria dos servidores ainda suporta 1.0 e 1.1; portanto, a menos que você bloqueie ativamente as solicitações HTTP / 1.0, não escolhe qual protocolo o cliente está usando. A maioria dos desenvolvedores de hoje não se preocupam em bloquear 1.0, portanto, ainda é uma prática recomendada, mesmo em 2019.
Randall Borck