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网络应用程序
ChromeDevTools列出了98个对web应用主页的请求(aspx+js+css+images)。在以下请求中,css/图像文件的状态代码为
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"