0

我是新来的HTTP缓存和真的需要一些帮助......HTTP缓存控制

  1. 我看到很多人发送XHR到服务器时设置"Cache-Control"头。 这样做的目的是什么?请求标头是否也需要缓存?

  2. 我已经为XHR设置了此标头: Cache-Control max-age=30, must-revalidate,但Firefox 3.6.13似乎在30秒后刷新(甚至是强制刷新)时不会重新验证文件。服务器中也没有访问日志。这是因为我没有在Apache中为文件设置过期头文件?

    从Firebug的日志:

    响应头
    日期星期六,2011年1月22 9点59分21秒GMT
    的Last-Modified周四,2011 GMT 9时05分11秒
    1月20日Etag的 “3e000000023ca7-20d-49a436e5b3413”

    请求头
    保持活动115
    连接保持
    内容类型的应用程序/ XML
    缓存控制最大年龄= 30,必重新验证

    该文件已被修改,但Firefox甚至没有做条件GET。 Response DateLast-Modified根本不更新。

回答

1

服务器需要设置重新验证指令,而不是客户端。

该源代码控制内容是否以及如何被cacehd缓存或不被缓存,客户端决定是否遵守该内容。

必须重新验证意味着发送了头部请求,并且如果etag不同,则会刷新资源。对于大文件来说,这是一种非常常见的非常常见的做法,因为一旦内容发生变化,电子标签一般会发生变化。

对于小文件,但它可能是你希望根本没有任何请求,但更短的时间。那么必须重新验证是错误的。 服务器负载和它消耗7kb图像的头部请求的时间并不比服务完整图像少得多。

1

客户端也可以发送Cache-Control指令。参见: http://tools.ietf.org/html/draft-ietf-httpbis-p6-cache-12#section-3.2

不幸的是,当XHR设置浏览器时,浏览器不会(尽管)承认它们,但是通常介入代理缓存。

+0

Yes客户端也可以发送Cache-Control指令,但根据IETF文档(和Mozilla的文档)必须重新验证不是客户端可以设置的指令之一,所以答案是正确的,说“服务器需要设置重新验证指令,而不是客户端“。但我同意,如果他们也表示客户可以设定最大年龄,这将会很有用。我不确定哪些浏览器版本在客户端执行并且不尊重他们;最好设置服务器上的所有内容。(另请参阅Chrome 35中修复的Chromium问题333804:它仍然影响Android 4.4应用程序中的WebView组件。) – 2017-06-23 21:45:18