http缓存实际上应该如何工作?

http缓存实际上应该如何工作?,http,http-headers,browser-cache,Http,Http Headers,Browser Cache,我知道这其实是一件老事情,但我真的有问题,关于这件事,以及它开始时应该如何工作。因此,我至少可以将这四个重要的缓存头发送回客户端(Last Modified,cache Control,Expires和ETag) 问题2.2的示例情况: 比如说我有一些文章的网站。 每15分钟到7天可能会有一篇新文章。 所以我将Cache Control和Expires设置为缓存15分钟,以便客户端始终获得它的最新版本 目前我对ETag和上次修改的的看法: 我只是在那里放了一些内容的散列,如果没有匹配,我可以发送

我知道这其实是一件老事情,但我真的有问题,关于这件事,以及它开始时应该如何工作。因此,我至少可以将这四个重要的缓存头发送回客户端(
Last Modified
cache Control
Expires
ETag

问题2.2的示例情况:

比如说我有一些文章的网站。 每15分钟到7天可能会有一篇新文章。 所以我将
Cache Control
Expires
设置为缓存15分钟,以便客户端始终获得它的最新版本

目前我对
ETag
上次修改的
的看法:

我只是在那里放了一些内容的散列,如果没有匹配,我可以发送客户端
304
if
if
==
ETag

如果自上次修改以来进行了修改,我可以发送客户端
304

问题

  • 我是否需要
    缓存控制
    过期
    来支持所有浏览器
  • 它看起来像是
    Cache Control
    Expires
    只告诉我的浏览器内容应该在计算机上缓存多长时间,对吗?
    • 所以我只能使用
      ETag
      Last Modified
      来确定何时应该发送
      304
      ,对吗
    • 所以我可以将
      Cache Control
      Expires
      设置为永久,如果
      ETag
      Last Modified
      更改了,就向客户端发送新版本?
      • 因为这在我的浏览器中有效,但在所有浏览器中都有效吗
  • 我是否需要
    ETag
    和上次修改的
    来支持所有浏览器
  • Pragma
    看起来像另一个类似于
    cache Control
    的缓存头,哪些浏览器正在使用
    Pragma
    ,我需要它吗
  • 我是否需要
    缓存控制
    过期
    来支持所有浏览器

    缓存控制
    在HTTP 1.1中引入,因此仅在支持HTTP 1.1的客户端上受支持<代码>过期
    自HTTP 1.0起受支持。如果两者都指定,则
    缓存控制
    优先,而
    过期
    将被完全忽略


    它看起来像是
    Cache Control
    Expires
    只告诉我的浏览器内容应该在计算机上缓存多长时间,对吗

    基本上,是的。如果
    缓存控件
    不存在(因此将使用
    过期
    ),或使用
    最大年龄设置为正确


    因此,我只能使用
    ETag
    Last Modified
    来确定何时发送304,对吗

    在这里,你的问题开始令人困惑。实际上,如果没有匹配的
    ,则需要检查
    ;如果修改了,则需要检查
    ,因为
    标题。通常,浏览器在条件GET请求中只发送其中一个,如果它与服务器中的当前值
    ETag
    Last Modified
    匹配,则返回304以及
    ETag
    头。请注意,若浏览器出于某种原因发送了这两个文件,那个么在修改后,您可以忽略


    所以我可以将
    Cache Control
    Expires
    设置为永久,如果
    ETag
    Last Modified
    更改了,就向客户端发送新版本

    否。如果将其设置为“永久”,则在最终用户按下(Ctrl)+F5键之前,客户端将永远不会发送(有条件的)请求。您需要将
    缓存控制:max age
    Expires
    设置为所需的缓存时间(将来可能设置为15分钟)


    因为这在我的浏览器中有效,但在所有浏览器中都有效吗

    注意测试方式:按F5键将始终发送条件GET请求。但一个简单的页面到页面导航和表单提交(就像在现实世界中一样)不会发送有条件的GET请求!按Ctrl+F5将忽略缓存并发送一个全新的GET请求


    我是否需要ETag和Last Modified来支持所有浏览器

    所有浏览器都支持两者。如果从服务器接收到ETag,并且浏览器需要执行条件GET请求,则浏览器需要通过
    将ETag发送回(如果不匹配)。
    。上次修改的
    是可选的,通常只有在资源上没有
    ETag
    时才会发送。另见


    Pragma看起来像另一个类似于cache-Control的缓存头,哪些浏览器正在使用Pragma,我需要它吗

    如果要缓存,则不需要它。只有在不想缓存的情况下才需要它(为了覆盖HTTP 1.0客户机/代理,尽管其数量目前正在稳步下降)


    如果您熟悉Java,或者至少能够破解它,那么您可能会发现本文很有帮助:

    另见:

    所以如果
    缓存控制
    说缓存版本可以使用,浏览器甚至不会发送HTTP请求,对吗?因此,只有当
    缓存控制
    指出缓存版本已过时时,才会发送HTTP请求,但如果服务器响应304,浏览器仍将使用缓存版本,对吗?如果这两个问题都是正确的,那么当
    max age=0
    或仅当它至少是
    max age=1
    时,响应是否会被缓存(本地)?(因此,当服务器以304响应时,可以使用某个内容。)这是正确的。请注意,除非您将更新的
    缓存控制
    过期
    标头与304一起发送回,否则浏览器将继续发送有条件的GET请求,304基本上会延迟缓存。