HTTP:结合过期和验证缓存

rou*_*tic 19 conditional caching http http-caching

我在为以下情况制定HTTP缓存标头时遇到问题.

我们的服务器有大量数据,每周可能会改变几次.我希望浏览器缓存这些数据.此外,我希望尽可能减少条件获取的延迟,因为网络不可靠.

我追求的最终行为是这样的:

  1. 客户端请求之前从未见过的资源.
  2. 服务器响应资源以及ETag和max-age(24小时).
  3. 直到24小时过去,客户端才会使用缓存资源.
  4. 在到期日期之后,客户端将执行验证请求(If-None-Match: [etag])
  5. 如果资源没有改变:
    • 服务器响应 304 Not Modified
    • 客户端以某种方式告知现有资源从现在起24小时内有新的到期日期
    • 回到第3步

归结为它的本能... 304响应可以包含一个新的max-age?或者原来是否max-age受到后续要求的尊重?

joe*_*rdi 29

是的,304响应可以包含一个新的max-age(或ETag,或其他响应头).

我做了一个使用Firefox 4来测试原始max-age或者新版本是否得到尊重的实验,答案是新版本max-age很受尊重,所以你应该能够实现你想要做的事情.

重要的是要记住,这max-age是相对于Date响应头,而不是Last-Modified,所以每当你的服务器设置一个max-age24小时的指令时,它就说"从现在开始24小时".所以,假设这是你想要的,你根本不需要改变你max-age,只需要总是返回86400.

无论如何,这是我的实验的概述和转储.基本上,我点击设置ETag的测试URL并设置max-age为120秒.因此,服务器返回带有这些响应头的页面:

HTTP/1.1 200 OK
Date: Tue, 14 Jun 2011 23:48:51 GMT
Cache-Control: max-age=120
Etag: "901ea3d0ac9303ae4855a09676f96701"
Last-Modified: Mon, 13 Jun 2011 22:20:03 GMT
Run Code Online (Sandbox Code Playgroud)

然后我重复点击地址栏中的"输入"来加载页面(但不强制重新加载).没有网络流量,因为Firefox反复从缓存重新加载页面.然后,在120秒结束后,当我下次进入时,Firefox会向服务器发送一个条件GET,正如您所期望的那样.来自服务器的请求和响应是:

GET /example HTTP/1.1
If-Modified-Since: Mon, 13 Jun 2011 22:20:03 GMT
If-None-Match: "901ea3d0ac9303ae4855a09676f96701"

HTTP/1.1 304 Not Modified
Date: Tue, 14 Jun 2011 23:50:54 GMT
Etag: "901ea3d0ac9303ae4855a09676f96701"
Cache-Control: max-age=240
Run Code Online (Sandbox Code Playgroud)

请注意,在304响应中,我已将服务器max-age从120秒更改为240.

所以,最大的问题是,120秒后会发生什么?Firefox会尊重新的max-age并继续从缓存中加载页面,还是会点击服务器?答案是它继续从缓存加载页面,直到达到240秒后才重新请求:

GET /example HTTP/1.1
If-Modified-Since: Mon, 13 Jun 2011 22:20:03 GMT
If-None-Match: "901ea3d0ac9303ae4855a09676f96701"

HTTP/1.1 304 Not Modified
Date: Tue, 14 Jun 2011 23:54:56 GMT
Etag: "901ea3d0ac9303ae4855a09676f96701"
Cache-Control: max-age=240
Run Code Online (Sandbox Code Playgroud)

我重复了另一个240秒的循环,事情按照你的预期运作.所以,希望能为你解答这个问题.

RFC解释年龄的计算应该如何实施,以及其他的Cache-Control参数是如何工作的.不能保证每个浏览器和代理都遵循这些规则,但此时HTTP 1.1已经很老了,你可以期待它们中的大多数都可以像Firefox一样.

(注意:为了简化这些示例转储,我删除了不相关的标头,例如主机,连接/保持活动,内容编码/长度/类型,用户代理等)

  • 我重复你用FireFox描述的内容.使用Chrome,点击位置栏中的"输入"仍然会导致304.我发现转到另一个页面(例如google.com),然后按下后退按钮将根据需要显示缓存行为.(有趣的是,如果我通过"前进"按钮到达我的页面,它总是显示缓存的文件.) (3认同)