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


166

我在Wikipedia上读到有关Pragma标头的内容:

“ Pragma:no-cache头字段是供请求使用的HTTP / 1.0头。这是浏览器告诉服务器和任何中间缓存的一种手段,它想要的是资源的最新版本,而不是服务器告诉用户不要缓存资源。某些用户代理确实在响应中注意此标头,但是HTTP / 1.1 RFC特别警告不要依赖此行为。”

但是我不知道它做什么?是什么之间的差异Cache-Control,其值是头no-cachePragma其值也no-cache

Answers:


196

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


31
尽管以下cnst的答案要复杂得多,但根据规范它也更加正确。Pragma: no-cache仅用于请求(意味着“我想要原始文件,而不是缓存的副本”),并且未为响应指定行为。
风土

5
Cache-Control: no-cache对请求具有相同的含义,但实际上也对响应进行了定义,即“如果将来要使用此内容的缓存副本,则必须先与我确认它是最新的(即执行重新验证)”。
风土

3
它用于缓存控制,不必仅用于防止缓存,也可以用来表示“您可以缓存它”。....
jave.web 2015年

基本答案。更复杂的是:它也是一个请求标头,这意味着您也可以将无缓存发送到服务器。这实际上可能意味着将过时的内容返回给客户端,这是什么?现在,您忘记了这一点,阅读上面的简单答案,享受生活,不要太用力地大声笑

它们两者都是为了防止客户端缓存响应,这对于读者来说是一个令人困惑的注释。它也可以具有max-age不阻止缓存的功能。它只是为其设置了到期日期...
蜂蜜

97

没有区别,只是Pragma仅定义为适用于客户端的请求,而客户端Cache-Control的请求和服务器的答复均可使用。

因此,就标准而言,只能从客户端发出请求和服务器从客户端接收请求的角度比较这些标准。该http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32定义方案如下:

HTTP / 1.1缓存应将“ Pragma:no-cache”视为客户端已发送“ Cache-Control: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

我读上面的方式:

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

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

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

当然,现实可能与RFC中所写或暗示的内容有所不同!


5
如果标题同时具有该怎么办?Cache-Control: max-age=86400Pragma: no-cache?那么现代浏览器会尊重哪一个?
PKHunter '17

3
@PKHunter,如果行为未定义,为什么还要关心它的前进方向呢?如果您对服务器负责,那么显然比向客户提供误导性信息更好。另外,正如我在回答中所指出的那样,Pragma: no-cache仅针对浏览器的请求定义了,因此从服务器到浏览器的回复中,它完全无效且未定义,例如,我想象每个单独的浏览器(无论是现代浏览器还是不是)应该在可能收到的任何回复中忽略此类标头。
cnst

3
如果两者均存在,现代浏览器应该忽略Pragma,而支持Cache-Control,因为后者可以指定时间段和其他最初的1.0协议中不可用的信息。
Randall Borck '18

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          |

如果是在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

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日,星期四,格林尼治标准时间


2
RFC指出,如果客户端不支持Cache-Control,则应同时使用它们:tools.ietf.org/html/rfc7234#page-29
Randall Borck,

3
客户端 “应当”包括-除非它想以不同方式对待HTTP / 1.1和HTTP / 1.0缓存服务器。服务器根本不应该包含Pragma(在HTTP / 1.0中,Pragma被定义为收件人特定于实现的指令的可扩展字段。该规范不赞成使用此类扩展来提高互操作性。)
Ian Boyd

2
从安全角度考虑,建议使用它。许多浏览器遵循编译:no-cache指令,因此,建议由OWASP使用它:owasp.org/index.php/...
兰德尔Borck

2
@RandallBorck:您正在传播过时的信息(至少二十年!)。 除非是1999年,否则没有任何浏览器会再遵循Pragma指令。这是对货物的狂热建议:“它不会造成伤害,我们一直都这样做,因此它是很好且必要的。”
Piskvor在

2
@Piskvor大多数服务器仍支持1.0和1.1,因此,除非您主动阻止HTTP / 1.0请求,否则您不会选择客户端使用的协议。如今,大多数开发人员都不必担心阻止1.0,因此,即使在2019
。– Randall Borck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.