无法缓存main_frame请求

时间:2013-03-12 09:33:14

标签: caching http-headers cache-control

我正在使用Chrome扩展程序来修改http响应标头。 https://chrome.google.com/webstore/detail/super-cache/fglobbnbihckpkodmeefhagijjcjnbeh/details

我无法缓存main_frame请求。我可以控制静态请求的缓存。

例如,如果我点击http://apple.com,我会收到main_frame的以下标题。

Accept-Ranges:bytes
Cache-Control:max-age=276
Connection:keep-alive
Content-Encoding:gzip
Content-Length:3310
Content-Type:text/html; charset=UTF-8
Date:Tue, 12 Mar 2013 09:24:12 GMT
Expires:Tue, 12 Mar 2013 09:28:48 GMT
Server:Apache
Vary:Accept-Encoding

但每次我点击网址时,浏览器都会尝试访问服务器并最终收到200响应。我已经尝试了所有可能的组合,可以设置标头以在main_frame上启用缓存。

当用户点击Chrome导航栏中的网址并且没有请求时,我想要这样做。

1 个答案:

答案 0 :(得分:2)

您在响应标头中缺少某种缓存验证。 ETag标头可用于通过向其添加标识唯一响应的值来控制该标头。您可以在Apache ETag documentation中阅读相关内容,但我只需在您的示例中的回复标题中添加ETag: [filename]

Accept-Ranges:bytes
Cache-Control:max-age=276
Connection:keep-alive
Content-Encoding:gzip
Content-Length:3310
Content-Type:text/html; charset=UTF-8
Date:Tue, 12 Mar 2013 09:24:12 GMT
Expires:Tue, 12 Mar 2013 09:28:48 GMT
Server:Apache
ETag: File:"somefile.html"
Vary:Accept-Encoding

这些ETag值几乎可以包含任何内容,例如文件名,文件大小,自定义值,......可以用分号;分隔。如果值包含空格,则将它们用双引号"括起来。例如:

ETag: File:"YouTube_cd_Fdly3rX8.jpg"; Size:12169

Cache-ControlExpires以及可能更改的其他一些标头值(包含在内,浏览器知道如何解释它们)一起构成了浏览器缓存验证程序的基础。

查看示例响应标头,您可能希望将Cache-Control中的 max-age 值增加到更高的值,因为您的示例建议它们应缓存客户端 - 方只有276秒。 Expires标头值似乎也有点短。

可以在RFC2616, Section 14.9中阅读有关如何设置这些值以及预期浏览器如何验证缓存控制标头的更多信息。

编辑:在进一步调试,检查并重新检查Chrome缓存验证的行为后,事实证明它确实不尊重正确设置Cache-Control响应标头。根据OP的要求,我已将此问题报告给Chrome支持人员:

  

Chrome,版本25.0.1364.172 m

     

在服务时不尊重主文档请求的缓存控制   来自Web服务器的静态文件,同时遵循相同的标头响应   关于链接的内容。

     

测试设置:

     

从Web服务器请求静态HTML文档(MIME text / html),   它包含另一个带有IFRAME的静态HTML文档(也是   MIME文本/ html)。 IFRAME服务文档具有相同的响应标头   通过Web服务器响应作为主文档附加到它:

Date: Thu, 21 Mar 2013 16:29:28 GMT
Expires: Thu, 21 Mar 2013 16:33:59 GMT
Cache-Control: max-age=301, max-stale=299, only-if-cached
     

预期行为:

     

将缓存主文档和IFRAME中提供的文档   本地初始请求,持续时间至少为301   (最大 - 年龄)秒,以及正常的额外299(最大陈旧)秒   (非强制)加载请求。此后的任何后续请求   预计不会使本地无效的301秒的时间范围   缓存(例如使用CTRL + F5强制刷新或重新加载上下文菜单   命令)并由正常的页面加载请求启动(例如,   重新输入地址栏中的相关URL)将从中加载   本地缓存,状态消息200 OK(来自缓存),如果没有   本地缓存控制信息另有说明(相同的URL,   在有效的缓存时间范围内请求,文档被标记为   正确缓存在其响应头中。)

     

<强>问题:

     

主文档未通过其缓存副本加载   请求发送到Web服务器,导致状态代码304 Not   改性。然而,IFRAME中的文档是从   本地缓存正确并导致状态消息200 OK(来自   高速缓冲存储器)。

     

备注:

     

没有任何缓存控制标记或其值的任何组合   对本地缓存的行为产生任何积极影响   主要文件。包含非唯一的ETag值并不能解决问题   缓存主文档的问题。其他主要厂商浏览器   (在IE,Firefox,Opera中测试)尊重主要的Cache-Control标头   文档。