Pragma和Cache-control标头之间的区别?

sap*_*Pro 157 protocols http httpresponse request http-headers

我在维基百科上读到了Pragma标题,其中说:

"Pragma:no-cache标头字段是用于请求的HTTP/1.0标头.它是浏览器告诉服务器和任何中间缓存它需要新资源的一种手段,而不是服务器告诉浏览器不要缓存资源.一些用户代理确实在响应中注意这个头,但HTTP/1.1 RFC专门警告不要依赖这种行为."

但我还不明白它的作用?是什么之间的差异Cache-Control,其值是头no-cachePragma其值也no-cache

小智 179

Pragma是HTTP/1.0实现,cache-control是同一概念的HTTP/1.1实现.它们都旨在阻止客户端缓存响应.较旧的客户端可能不支持HTTP/1.1,这就是该标头仍在使用的原因.

  • 虽然下面的cnst的答案要复杂得多,但根据规范,它也更加正确.`Pragma:no-cache`仅用于请求(意思是"我想要原始文件,而不是缓存副本"),并且没有为响应指定其行为. (31认同)
  • `Cache-Control:no-cache`对于请求具有相同的含义,但实际上也是为响应定义的,这意味着"如果你想在将来使用这个的缓存副本,你必须首先检查一下它是否符合要求-date(即执行重新验证)". (5认同)
  • 它用于缓存控制,它不必仅用于缓存防止,它也可以用来表示"你可以缓存它"..... (3认同)

cns*_*nst 94

没有区别,除了Pragma仅定义为适用于客户端的请求,而客户端Cache-Control的请求和服务器的回复都可以使用.

因此,就标准而言,它们只能从发出请求的客户端和服务器接收来自客户端的请求的角度进行比较.该http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32定义场景如下:

HTTP/1.1缓存应该像处理客户端发送"Cache-Control:no-cache"一样对待"Pragma:no-cache".在HTTP中不会定义新的Pragma指令.

  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
Run Code Online (Sandbox Code Playgroud)

我将如何阅读以上内容:

  • 如果您正在编写客户并且需要no-cache:

    • 只是Pragma: no-cache在您的请求中使用,因为您可能不知道Cache-Control服务器是否支持;
    • 但在回复中,要决定是否缓存,请检查 Cache-Control
  • 如果您正在编写服务器:

    • 在解析来自客户端的请求时,检查Cache-Control; 如果没有找到,检查Pragma: no-cache并执行Cache-Control: no-cache逻辑;
    • 在回复中,提供Cache-Control.

当然,现实可能与RFC中的书面或暗示有所不同!

  • 如果标题有两个怎么办?`Cache-Control:max-age = 86400`和`Pragma:no-cache`?哪一个将被现代浏览器所尊重? (5认同)
  • @PKHunter,如果行为未定义,你为什么要关心它走哪条路?如果您对服务器负责,显然您可以做得更好,而不是向客户提供误导性信息.另外,正如我的回答所指出的那样,`Pragma:no-cache`仅针对来自浏览器的请求定义,因此在从服务器到浏览器的回复中完全无效且未定义,例如,我想象每个浏览器(无论是否现代)都应该在它可能收到的任何回复中忽略这样的标题. (3认同)
  • 如果两者均存在,现代浏览器应忽略Pragma,而支持Cache-Control,因为后者可以指定时间段和其他最初的1.0协议中不可用的信息。 (3认同)

Ian*_*oyd 10

| 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          |
Run Code Online (Sandbox Code Playgroud)

如果是在1999年之后,并且您仍在使用ExpiresPragma,那说明您做错了。

我在看你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
Run Code Online (Sandbox Code Playgroud)

tl; dr:Pragma是HTTP / 1.0的旧版,自Internet Explorer 5或Netscape 4.7起就不再需要。除非您期望某些用户正在使用IE5,否则可以安全地停止使用它。


  • 过期:( [date] 不建议使用-HTTP 1.0)
  • 语法:无缓存(不建议使用-HTTP 1.0)
  • 快取控制: max-age =[seconds]
  • 缓存控制:无缓存(每次必须重新验证缓存的副本)

和条件请求:

  • 基于Etag(实体标签)的条件请求
    • 服务器: Etag: W/“1d2e7–1648e509289”
    • 客户: If-None-Match: W/“1d2e7–1648e509289”
    • 服务器: 304 Not Modified
  • 修改的基于日期的条件请求
    • 服务器: last-modified: Thu, 09 May 2019 19:15:47 GMT
    • 客户: If-Modified-Since: Fri, 13 Jul 2018 10:49:23 GMT
    • 服务器: 304 Not Modified

最后修改时间:周四,2019年5月9日19:15:47 GMT

  • * client * *“应该” *包括两者-除非它想不同地对待HTTP / 1.1和HTTP / 1.0缓存服务器。服务器完全不应包含“ Pragma”。*(在HTTP / 1.0中,Pragma被定义为收件人指定实现的指令的可扩展字段。此规范不赞成使用此类扩展,以提高互操作性。)* (3认同)
  • @RandallBorck:您正在传播过时的(至少二十年!)信息。* 没有* 浏览器不再遵循 Pragma 指令,除非是 1999 年。这是货物崇拜的建议:“它没有伤害,我们一直这样做,因此它是好的和必要的。” (3认同)
  • @Piskvor 大多数服务器仍然支持 1.0 和 1.1,因此除非您主动阻止 HTTP/1.0 请求,否则您不会选择客户端使用的协议。今天的大多数开发人员都不愿意阻止 1.0,因此即使在 2019 年它仍然是最佳实践。 (3认同)
  • RFC 说你应该同时使用它们,以防客户端不支持缓存控制:https://tools.ietf.org/html/rfc7234#page-29 (2认同)
  • 从安全的角度来看,建议使用它。许多浏览器遵循 pragma: no-cache 指令,因此建议 OWASP 使用它:https://www.owasp.org/index.php/OWASP_Application_Security_FAQ#How_do_I_ensure_that_sensitive_pages_are_not_cached_on_the_user.27s_browser.3F (2认同)
  • @DavidS 如果您主动阻止 HTTP/1.0,那么只需使用 Cache-Control 即可。如果您允许 HTTP/1.0 请求,那么您还有责任遵循该协议的安全最佳实践并包含 Pragma 标头。如果您不知道可以阻止 HTTP/1.0,请设计您的站点以支持它。我不认为阻止 HTTP/1.0 并删除标头有什么问题,但是如果您宣传并提供客户端协议,您就有尽职调查义务确保该客户端的安全,即使您不喜欢他们的协议协议的选择。 (2认同)
  • SO 已停止提供 Pragma 服务,现在仅依赖于缓存控制。 (2认同)