51

背景:

  • IIS 7
  • AspNet 3.5 网络应用程序

Chrome 开发工具列出了 98 个对 Web 应用主页的请求(aspx + js + css + 图片)。在以下请求中,状态代码200用于 css/images 文件。没有缓存信息,浏览器每次都询问服务器是否需要更新文件。好的。

在 IIS 7 中,我为缓存控制设置了 HTTP 标头,将“资源”文件夹设置为 6 小时。在 Chrome 中,使用开发工具,我可以看到标题设置得很好:

Cache-Control: max-age=21600

但是我仍然收到 98 个请求...我认为如果未达到到期日期,浏览器不应该请求一个资源,并且我期望请求的数量会下降...

4

8 回答 8

106

我知道了。如果您在对同一选项卡中的同一 URI 的另一个请求之后立即发出请求(通过单击刷新按钮、按下键或按+ ) , Google Chrome 浏览器会忽略Cache-Controlor标头。它可能有一个算法来猜测用户真正想要做什么。ExpiresF5CommandR

测试Cache-Control标头的一种方法是返回一个带有自身链接的 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 并将其粘贴到同一选项卡或另一个选项卡中。

更新:在2017 年 1 月 26 日发布的 Chrome 帖子中,描述了以前的行为以及它是如何通过仅重新验证主资源而不是子资源来改变的:

用户通常会因为页面损坏或内容过时而重新加载。现有的重新加载行为通常可以解决损坏的页面,但定期重新加载无法有效解决陈旧的内容,尤其是在移动设备上。此功能最初是在损坏页面非常普遍的时候设计的,因此一次解决两个用例是合理的。然而,随着网页质量的提高,这种最初的担忧现在变得不那么重要了。为了改进陈旧的内容用例,Chrome 现在有一个简化的重新加载行为,只验证主要资源并继续正常的页面加载。这种新行为最大限度地重复使用缓存资源,并降低延迟、功耗和数据使用量。

同样于 2017 年 1 月 26 日发布的 Facebook 帖子中,提到他们发现一段代码是 Chrome 在 POST 请求后使所有缓存的资源无效:

我们发现 Chrome 会重新验证通过 POST 请求加载的页面上的所有资源。Chrome 团队告诉我们这样做的理由是 POST 请求往往是进行更改的页面——比如进行购买或发送电子邮件——并且用户希望拥有最新的页面。

似乎不再是这种情况了。

最后,描述了 Firefox 正在引入Cache-Control: immutable完全停止资源的重新验证:

Firefox 实现了我们的一位工程师的提议,为某些资源添加一个新的缓存控制标头,以便告诉浏览器永远不应该重新验证该资源。这个标头背后的想法是,它是开发人员向浏览器额外承诺的,即该资源在其 max-age 生命周期内永远不会改变。Firefox 选择以 cache-control: immutable header 的形式来实现这个指令。

我希望这有助于解开重新加载的奥秘。

于 2013-02-12T21:54:23.520 回答
21

Cache-Control如果您在同一标签中重新加载,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

但是,从多个新选项卡访问相同的 URLhttp://localhost:4567/会从缓存中回收先前的结果。

于 2014-10-08T17:44:31.437 回答
18

在做了一些测试之后Cache-Control:max-age=xxx

  • 按下重新加载按钮:标题被忽略
  • 输入相同的网址任何选项卡(当前或不是):尊敬
  • 使用 JS ( window.location.reload()):忽略
  • 使用开发者工具(禁用缓存未选中)或隐身不影响

因此,开发时最好的选择是将光标放在多功能框中,然后按回车而不是刷新按钮。

注意:右键单击刷新图标将显示刷新选项(正常、硬、空缓存)。令人难以置信的是,这些都不会影响这些标题。

于 2015-12-15T16:41:09.427 回答
13

如果 Chrome 开发者工具打开 (F12),Chrome 通常会禁用缓存。

它可以在开发工具设置中控制 - 开发工具顶部栏右侧的齿轮图标。

于 2014-07-15T16:10:54.837 回答
11

虽然这个问题很老,但我想补充一点,如果您正在通过 https 使用自签名证书进行开发并且证书存在问题,那么无论您使用什么缓存标头,谷歌都不会缓存响应。

此错误报告中对此进行了说明: https ://bugs.chromium.org/p/chromium/issues/detail?id=110649

于 2019-03-11T12:18:24.710 回答
0

这是一个很老的问题,但我最近(2020 年)注意到,在使用隐身窗口浏览时,Chrome 有时会忽略我的图像资源的 Cache-Control 标头。

“有时”是因为在我的情况下,缓存控制指令适用于小图像(~60-200KB),但不适用于较大的图像(10MB)。

不使用隐身窗口会导致 Chrome 使用磁盘缓存版本,即使对于大图像也是如此。

于 2020-07-09T08:54:58.010 回答
0

这是对kievic 答案的补充

要强制浏览器不在Cache-Control请求中发送标头,请打开 chrome 控制台并输入:

location = "https://your.page.com"

要强制浏览器添加此标题,请单击“重新加载”按钮。

于 2020-01-31T12:10:00.910 回答
-2

另一个提示:

不要忘记验证“日期”标头 - 如果服务器的日期/时间不正确(或位于另一个时区) - Chrome 将继续一次又一次地请求资源。

于 2016-04-06T09:42:52.580 回答