【问题标题】:Difference between Pragma and Cache-Control headers?Pragma 和 Cache-Control 标头之间的区别?
【发布时间】:2012-05-06 01:11:35
【问题描述】:

我在Wikipedia 上读到了 Pragma 标题,上面写着:

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

但我不明白它的作用是什么?值为no-cacheCache-Control标头和值为no-cachePragma有什么区别?

【问题讨论】:

    标签: http http-headers request protocols httpresponse


    【解决方案1】:
    Stop using (HTTP 1.0) Replaced with (HTTP 1.1 since 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)
    • Pragma: 无缓存 (已弃用 - HTTP 1.0)
    • 缓存控制: max-age=[seconds]
    • Cache-Control:无缓存(每次都必须重新验证缓存的副本)

    还有条件请求:

    • 基于 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

    【讨论】:

    • RFC 说你应该同时使用它们,以防客户端不支持缓存控制:tools.ietf.org/html/rfc7234#page-29
    • client "ought to" 包括两者——除非它想以不同的方式对待 HTTP/1.1 和 HTTP/1.0 缓存服务器。服务器根本不应该包含Pragma(在 HTTP/1.0 中,Pragma 被定义为接收者的实现指定指令的可扩展字段。本规范弃用此类扩展以提高互操作性。)
    • 从安全角度来说,推荐使用。许多浏览器都遵循pragma:no-cache指令,因此OWASP建议使用它:owasp.org/index.php/…
    • @RandallBorck:您正在传播过时的(至少两个十年!)信息。 No 浏览器不再遵循 Pragma 指令,除非是 1999 年。这是货物崇拜的建议:“它没有坏处,我们一直这样做,因此它是好的和必要的。”
    • @Piskvor 大多数服务器仍然支持 1.0 和 1.1,因此除非您主动阻止 HTTP/1.0 请求,否则您不会选择客户端使用的协议。今天的大多数开发人员都懒得阻止 1.0,因此即使在 2019 年,它仍然是最佳实践。
    【解决方案2】:

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

    【讨论】:

    • 虽然下面cnst的答案要复杂得多,但按照规范也正确得多。 Pragma: no-cache 仅用于请求中(意思是“我想要原始文件,而不是缓存副本”),并且未指定响应的行为。
    • Cache-Control: no-cache 对于请求具有相同的含义,但实际上也为响应定义,意思是“如果您以后想使用它的缓存副本,您必须先与我确认它已启动-to-date(即执行重新验证)”。
    • 它是用于缓存控制的,它不一定只用于防止缓存,它也可以用来说“你可以缓存这个”。 ....
    • 基本答案。让它变得更复杂:它也是一个请求标头,这意味着您也可以向服务器发送 no-cache 。这实际上可能意味着将陈旧的内容返回给客户,什么?现在你忘记这一点,阅读上面的简单答案并享受你的生活,不要太努力地挖掘它哈哈
    • 它们都是为了防止客户端缓存响应对于读者来说是一个令人困惑的注释。它也可以有max-age,它不会阻止缓存。它只是为它设置了一个到期日期......
    【解决方案3】:

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

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

    HTTP/1.1 缓存应该将“Pragma: no-cache”视为客户端拥有 发送“缓存控制:无缓存”。不会有新的 Pragma 指令 在 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
    

    我阅读上述内容的方式:

    • 如果你正在写一个客户端并且需要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=86400Pragma: no-cache?现代浏览器会尊重哪一个?
    • @PKHunter,如果行为未定义,您为什么要关心它的走向?如果您负责服务器,显然您可以做得比向客户端提供误导性信息更好。此外,正如我在回答中指出的那样,Pragma: no-cache 仅针对来自浏览器的请求定义,因此在服务器对浏览器的回复中它将完全无效且未定义,例如,我想每个浏览器(无论是否现代)都应该在它可能收到的任何回复中忽略这样的标题。
    • 如果两者都存在,现代浏览器应该忽略 Pragma 而支持 Cache-Control,因为后者可以指定初始 1.0 协议中不可用的时间段和其他信息。
    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 2021-03-22
    • 2021-06-08
    • 1970-01-01
    • 2021-05-12
    • 2013-08-11
    • 2011-11-26
    相关资源
    最近更新 更多