Iis Chrome是否忽略缓存控制:最大年龄?
背景:Iis Chrome是否忽略缓存控制:最大年龄?,iis,google-chrome,cache-control,content-expiration,Iis,Google Chrome,Cache Control,Content Expiration,背景: IIS 7 AspNet 3.5网络应用程序 ChromeDevTools列出了98个对web应用主页的请求(aspx+js+css+images)。在以下请求中,css/图像文件的状态代码为200。无缓存信息,浏览器每次都会询问服务器是否需要更新文件。嗯 在IIS 7中,我为缓存控制设置HTTP头,为“ressources”文件夹设置为6小时。在Chrome中,使用dev工具,我可以看到标题在响应中设置得很好: Cache-Control: max-age=21600 但我仍然收
- IIS 7
- AspNet 3.5网络应用程序
200
。无缓存信息,浏览器每次都会询问服务器是否需要更新文件。嗯
在IIS 7中,我为缓存控制设置HTTP头,为“ressources”文件夹设置为6小时。在Chrome中,使用dev工具,我可以看到标题在响应中设置得很好:
Cache-Control: max-age=21600
但我仍然收到98个请求。。。我认为浏览器不应该在一个ressource的过期日期未到时请求它,我希望请求的数量会下降…我得到了它。如果您在对同一选项卡中的同一URI发出另一个请求后立即发出请求(通过单击刷新按钮、按F5键或按Command+R),Google Chrome将忽略
缓存控制
或过期
标题。它可能有一个算法来猜测用户真正想要做什么
测试缓存控件
头的一种方法是返回一个带有自身链接的HTML文档。单击链接时,Chrome从缓存中提供文档。例如,命名以下文档self.html:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Test Page</title>
</head>
<body>
<p>
<a href="self.html">Link to the same page.</a>
If correctly cached, a request should not be made
when clicking the link.
</p>
</body>
</html>
测试页
如果缓存正确,则不应发出请求
单击链接时。
另一个选项是复制URL并将其粘贴到同一选项卡或其他选项卡中
更新:在一个示例中,通过仅对主资源(而非子资源)进行重新验证,描述了以前的行为以及它是如何改变的:
用户通常会因为页面损坏或内容过时而重新加载。现有的重新加载行为通常可以解决断页问题,但通过定期重新加载(尤其是在移动设备上)来解决陈旧内容的效率低下。这个特性最初是在断页非常普遍的时候设计的,所以同时处理这两个用例是合理的。然而,随着网页质量的提高,这种最初的担忧现在变得不那么重要了。为了改善陈旧内容的使用情况,Chrome现在有一个简化的重新加载行为,只验证主资源并继续常规页面加载。这种新的行为最大限度地重用了缓存资源,降低了延迟、功耗和数据使用率
在一篇文章中,提到他们发现一个浏览器在POST请求后使所有缓存的资源无效:
我们发现Chrome会重新验证通过POST请求加载的页面上的所有资源。Chrome团队告诉我们这样做的理由是,POST请求往往是做出更改的页面——比如购买或发送电子邮件——并且用户希望拥有最新的页面
看来情况已经不是这样了
最后,描述了Firefox正在引入缓存控制:immutable
,以完全停止资源的重新验证:
Firefox实施了我们的一位工程师的建议,为某些资源添加一个新的缓存控制头,以便告诉浏览器该资源永远不应重新验证。此标题背后的想法是,开发人员向浏览器额外承诺,此资源在其最长使用期限内不会更改。Firefox选择以缓存控件的形式实现该指令:immutable标头
我希望这有助于解开重新加载的谜团。如果Chrome开发者工具处于打开状态(F12),Chrome通常会禁用缓存
它可以在开发者工具设置中控制-开发者工具顶栏右侧的齿轮图标。如果您在同一选项卡中重新加载,Chrome似乎忽略了您的
缓存控制设置。如果您将URL复制到一个新选项卡并加载到那里,Chrome将尊重缓存控制标记并重用缓存中的内容
例如,我有一个Ruby Sinatra应用程序:
#!/usr/bin/env ruby
require 'sinatra'
before do
content_type :txt
end
get '/' do
headers "Cache-Control" => "public, must-revalidate, max-age=3600",
"Expires" => Time.at(Time.now.to_i + (60 * 60)).to_s
"This page rendered at #{Time.now}."
end
当我不断地在同一个Chrome选项卡中重新加载它时,它会显示新的时间
This page rendered at 2014-10-08 13:36:46 -0400.
This page rendered at 2014-10-08 13:36:48 -0400.
标题如下所示:
< HTTP/1.1 200 OK
< Content-Type: text/plain;charset=utf-8
< Cache-Control: public, must-revalidate, max-age=3600
< Expires: 2014-10-08 13:36:46 -0400
< Content-Length: 48
< X-Content-Type-Options: nosniff
< Connection: keep-alive
* Server thin is not blacklisted
< Server: thin
但是访问相同的URL时,http://localhost:4567/来自多个新选项卡的
将从缓存中回收以前的结果。使用缓存控件执行一些测试后:max age=xxx
:
- 按重新加载按钮:标题被忽略
- 在任何选项卡(当前或非当前)中输入相同的url:
- 使用JS(
window.location.reload()
):忽略
- 使用开发人员工具(未选择禁用缓存)或匿名不会影响
因此,开发时最好的选择是将光标放在omnibox中,然后按enter键而不是按refresh按钮
注意:右键单击刷新图标将显示刷新选项(普通、硬、空缓存)。难以置信的是,这些都不会影响这些标题。另一个提示:
别忘了验证“日期”标题-如果服务器的日期/时间不正确(或位于另一个时区)-Chrome将一次又一次地请求资源。这个问题已经过时,我想补充一点,如果您使用https上的自签名证书进行开发,并且证书存在问题,那么无论您使用什么缓存头,google都不会缓存响应
此错误报告中指出了这一点:
这是对
强制浏览器不发送缓存控制
标题
location = "https://your.page.com"