Caching 无法缓存主帧请求
我正在开发一个修改http响应头的chrome扩展。 我无法缓存主帧请求。不过,我能够控制静态请求的缓存 例如,如果我点击,我会收到以下主框架的标题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
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你可以通过查看你报告的所有问题。