HTTP:组合到期和验证缓存

问题描述

| 我在为以下情况制定HTTP缓存头时遇到麻烦。 我们的服务器具有大数据,可能每周更改几次。我希望浏览器缓存此数据。另外,由于网络不可靠,我想最小化有条件获取的延迟。 我追求的最终行为是这样的: 客户端请求一个从未见过的资源。 服务器响应资源以及ETag和ѭ0respond(24小时)。 在24小时过去之前,客户端将使用缓存的资源。 到期后,客户端将执行验证请求(
If-None-Match: [etag]
) 如果资源未更改: 服务器以ѭ2响应 客户从某种程度上被告知现有资源的新过期日期是从现在起24小时 返回步骤3 归根结底是304响应中是否可以包含新的
max-age
?还是原版的“ 0”可满足以后的要求?     

解决方法

        是的,一个304响应可以包含一个新的“ 0”(或ETag,或与此相关的其他响应头)。 我使用Firefox 4进行了一项实验,以测试是否符合原始的最大年龄或新的最大年龄,答案是兑现了新的“ 0”,因此您应该能够实现自己想做的事情。 重要的是要记住,“ 0”是相对于“ 8”响应标头,而不是“ 9”,因此,只要您的服务器将“ 0”指令设置为24小时,就说“从现在开始24小时。”因此,假设\就是您想要的,您完全不必更改
max-age
,只需返回86400。 无论如何,这是我的实验的概述和转储。基本上,我点击了一个测试URL,该URL设置了一个ETag并将“ 0”设置为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
然后,我重复点击地址栏中的“输入”以加载页面(但不强制重新加载)。由于Firefox反复从缓存中重新加载页面,因此没有网络流量。然后,在120秒结束后,我下次按下Enter键时,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
请注意,在304响应中,我已将服务器的“ 0”从120秒更改为240秒。 因此,最大的问题是,120秒后会发生什么? Firefox是否会尊重新的“ 0”并继续从缓存中加载页面,还是会打入服务器?答案是它继续从缓存加载页面,直到达到240秒后才重新请求:
GET /example HTTP/1.1
If-Modified-Since: Mon,14 Jun 2011 23:54:56 GMT
Etag: \"901ea3d0ac9303ae4855a09676f96701\"
Cache-Control: max-age=240
我重复了另一个240秒的周期,一切都按您的预期进行。因此,希望能为您解答问题。 RFC解释了应该如何实现年龄计算,以及其他Cache-Control参数如何工作。不能保证每个浏览器和代理都将遵守规则,但是在这一点上,HTTP 1.1已经很老了,您希望它们中的大多数都能像Firefox一样。 (注意:为简便起见,在这些示例转储中,我删除了不相关的标头,例如主机,连接/保持有效,内容编码/长度/类型,用户代理等)。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...