rou*_*tic 19 conditional caching http http-caching
我在为以下情况制定HTTP缓存标头时遇到问题.
我们的服务器有大量数据,每周可能会改变几次.我希望浏览器缓存这些数据.此外,我希望尽可能减少条件获取的延迟,因为网络不可靠.
我追求的最终行为是这样的:
max-age(24小时).If-None-Match: [etag])304 Not Modified 归结为它的本能... 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一样.
(注意:为了简化这些示例转储,我删除了不相关的标头,例如主机,连接/保持活动,内容编码/长度/类型,用户代理等)
| 归档时间: |
|
| 查看次数: |
6720 次 |
| 最近记录: |