Chrome - 为什么会发送if-modified-since请求?

20

我有一个包含许多小图标的页面。在使用Chrome浏览器时,每次重新加载页面时,Chrome都会带上if-modified-since头从服务器请求每个图标。

所有图标都附带了过期和最大年龄头信息。而Firefox则从其缓存中加载图像。

为什么Chrome会这样做,我该如何防止它?

谢谢!

7个回答

14

1
谢谢,这回答了我一个问题。 - Jacob Krall

13

在Chrome浏览器中,刷新页面和仅访问页面是有区别的。

当你刷新页面时,无论文件是否已被缓存,Chrome都会向服务器发送请求。如果文件未修改,你将看到304 Not Modified响应;如果文件已修改,则会看到200 OK响应。

而在非刷新情况下,缓存文件将显示200 OK状态,但如果你查看网络面板的大小/内容列,你会看到(from cache)字样。


这也适用于Firefox,我想今天试试看。 - David Winiecki

12

如果Expires头不符合RFC规定的有效日期格式,Google Chrome将会忽略它。例如,Chrome总是要求以双数字表示天数。例如5月1日应该设置为“01 May”(而不是“1 May”)等等。而Firefox则会接受这种头部,这会误导用户认为问题出在浏览器(即Chrome)而不是头部数值本身。

因此,如果您手动设置到期日期(而不使用mod_expires或类似方法来计算实际日期),我建议您使用REDbot检查您的静态文件头。


9
使用Chrome的检查器进行快速实验可以发现,这种情况只会在页面重新加载时发生,而不是正常加载时。Chrome只是试图刷新其缓存。想一想——如果您将ExpiresMax-Age设置为几十年,那么您是在要求浏览器缓存该资源并且永远不检查它是否已更新?当它能够缓存资源时,它会进行缓存,但当需要刷新页面时,它希望确保整个页面都被刷新。其他浏览器肯定也会这样做(尽管有些浏览器有一个选项,可以等待几个小时再进行刷新)。
由于现代浏览器和服务器的支持,刷新大量图标的速度不会像您想象的那样慢——请求是流水线化的,以消除多次往返延迟,并且If-Modified-Since头的整个目的是允许服务器比较时间戳并返回“未修改”状态代码。这将对页面所需的每个资源都发生,但浏览器将能够同时发出所有请求并验证它们是否都没有更改。
话虽如此,您可以采取一些措施使其更容易:
  1. 使用Chrome的检查器,在资源选项卡中查看它们是如何加载的。如果没有请求头,则该资源直接从缓存加载。如果您看到304未修改,则刷新了该资源但不需要再次下载。如果您看到200 OK,则已重新下载。

  2. 在Chrome的检查器中,使用审核选项卡查看它对您的资源可缓存性的看法,以防一些缓存标头不太理想。

  3. 尽管它们只包含头信息,所有这些If-Modified-Since请求和304响应都会累加。将您的图像合并成精灵,以减少请求数量。


我真的对这一切感到困惑。当然,刷新应该检查新内容,听起来没错。但是Chrome也会为普通页面加载发送这些请求。更让人困惑的是,现在行为似乎突然改变了,图像从缓存中获取而没有任何if-modified请求。我什么都没改啊。当系统像这样不确定时,我很讨厌它。 - user473428
据我所知,这是正确的行为。安迪提供的IE链接描绘了一个类似的画面——假设有适当的缓存头,会话中的第一次访问始终检查更新资源,此后始终缓存直到请求重新加载。我知道这不是很简单,也许我能说的最好的就是编写浏览器、代理和服务器的人们已经投入了比你我更多的时间。我会相信他们的判断。 - Josh Lee

4

2
嗯...我并不喜欢收到许多不必要的请求并同时破坏用户体验。无论如何,感谢您提供有趣的阅读。 - user473428

0

听起来它试图通过向服务器询问图片自上次请求以来是否已更改来避免使用过时的缓存。这听起来是件好事,不是你想要阻止的事情。


0

假设您正在运行Apache,您可以尝试为文件类型和/或文件系统中的某些位置明确设置缓存生命周期。

<FilesMatch ".(jpg|jpeg|png|gif)$">
Header set Cache-Control "max-age=604800, public" # 7 days
</FilesMatch>

或者类似这样的方式

ExpiresByType image/jpeg "access plus 7 days"
ExpiresByType image/gif "access plus 7 days"
ExpiresByType image/png "access plus 7 days"

通常,我会将使用相同类型的文件分组到单个目录中,并相应地设置生命周期。

浏览器直到这些时间过期之前都不应该请求文件,但可能并不总是遵守。您可能需要对Last-Modified和ETag头进行调整。网络上有很多关于此的好信息。


在标题行上的“#7天”注释会导致Apache无法加载。显然,它不喜欢行末的注释。 - Elliptical view

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接