Caching 无法缓存主帧请求

Caching 无法缓存主帧请求,caching,http-headers,cache-control,Caching,Http Headers,Cache Control,我正在开发一个修改http响应头的chrome扩展。 我无法缓存主帧请求。不过,我能够控制静态请求的缓存 例如,如果我点击,我会收到以下主框架的标题 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:2

我正在开发一个修改http响应头的chrome扩展。

我无法缓存主帧请求。不过,我能够控制静态请求的缓存

例如,如果我点击,我会收到以下主框架的标题

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
但每次我点击url,浏览器都会尝试访问服务器,最终收到200条响应。我已经尝试了所有可能的组合,可以将头设置为在主框架上启用缓存


我希望当用户从chrome的导航栏点击url时,不会发出任何请求。

您的响应头中缺少某种缓存验证
ETag
header可以通过向其中添加可标识唯一响应的值来控制该响应。您可以在中阅读一些关于它的内容,但我只想在您的示例中的响应标题中包含
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
缓存控制
过期
和其他一些可能会更改的标题值(包括在内并且浏览器知道如何解释它们)一起,将构成浏览器缓存验证程序的基础

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

有关如何设置这些值以及浏览器如何验证缓存控制头的更多信息,可以在中读取

编辑:在进一步调试、检查和重新检查Chrome缓存验证的行为后,发现它确实不尊重正确设置的
缓存控制
响应头。根据OP的要求,我已向Chrome支持部门报告了此问题:

Chrome,版本25.0.1364.172 m

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

测试设置:

从web服务器请求静态HTML文档(MIME文本/HTML), 包含另一个带有IFRAME的静态HTML文档(也包括 MIME text/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中测试)尊重主服务器上的缓存控制头 文件


@RobW其实与代码无关,我只是想知道浏览器缓存文件的正确标题。您添加了google chrome扩展标记和一些与标题相关的标记。因此,您可能有一些使用
chrome.webRequest
API的代码。包含这些代码将极大地帮助其他人评估您的问题匹配他们的问题(谷歌搜索也会更容易)。我最好更新标签。我不想让人们觉得这是一个与扩展相关的问题,这会让他们感到困惑。设置这些标题对于静态资源很好,但是当所有“文档“类型请求总是由服务器验证,因此会产生304响应。我希望文档类型请求也可以直接从缓存中获取。我正在使用chrome作为浏览器。@TidalWave,现在我正在设置一个最大年龄值以及expires标题。所有这些设置对于静态资源都非常有效。它们不使用文档类型资源。我觉得chrome根本不会缓存文档类型请求。您是否知道某个网站缓存了文档类型资源,以致浏览器根本不向服务器发出请求?@TidalWave,请将此对话移至聊天室。我真的很想看到链接。我想我没有创建聊天的权利。你能把你报告的chrome bug的链接放进去吗?@TildalWave你可以通过查看你报告的所有问题。