Pragma 和 Cache-Control header 之间的区别?

我读到维基百科上的编译指示头文件,它说:

Pragma: no-cache报头字段是用于HTTP/1.0的报头 在请求中使用。它是浏览器告诉服务器和的一种方法 任何它想要资源的新版本的中间缓存, 服务器不能告诉浏览器不要缓存资源。一些 用户代理确实会在响应中注意这个报头,但是 HTTP/1.1 RFC特别警告不要依赖这种行为。" < / p >

但我不明白它是做什么的?值为no-cacheCache-Control头文件和值同样为no-cachePragma头文件有什么区别?

212168 次浏览

Pragma是HTTP/1.0实现,而cache-control是相同概念的HTTP/1.1实现。它们都是为了防止客户机缓存响应。旧的客户端可能不支持HTTP/1.1,这就是为什么这个头仍然在使用。

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

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

HTTP/1.1缓存应该处理“Pragma: no-cache”,如果客户端有 发送“Cache-Control: no-cache”。不会有新的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
    • 李< / ul > < / >
    • 如果你正在写一个服务器:

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

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

停止使用(HTTP 1.0) 替换为(HTTP 1.1自1999年起)
到期(日期): cache - control:信息=[秒]
编译指示:no - cache cache - control: no - cache

如果在1999年之后,你仍然在使用到期编译指示,你就做错了。

我看着你,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:停止使用它是安全的。


  • __abc1 __abc0 __abc2
  • 编译指示: no-cache
  • cache - control:信息= [seconds]
  • cache - control: no-cache

条件请求:

  • 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