我有一个包含许多小图标的页面。在使用Chrome浏览器时,每次重新加载页面时,Chrome都会带上if-modified-since头从服务器请求每个图标。
所有图标都附带了过期和最大年龄头信息。而Firefox则从其缓存中加载图像。
为什么Chrome会这样做,我该如何防止它?
谢谢!
我有一个包含许多小图标的页面。在使用Chrome浏览器时,每次重新加载页面时,Chrome都会带上if-modified-since头从服务器请求每个图标。
所有图标都附带了过期和最大年龄头信息。而Firefox则从其缓存中加载图像。
为什么Chrome会这样做,我该如何防止它?
谢谢!
你检查过请求头了吗?
"无论你是按回车键、F5还是Ctrl+F5,'Cache-Control'始终设置为'max-age=0'。除非你启动Chrome,输入URL并按回车键。"
http://techblog.tilllate.com/2008/11/14/clientside-cache-control/
在Chrome浏览器中,刷新页面和仅访问页面是有区别的。
当你刷新页面时,无论文件是否已被缓存,Chrome都会向服务器发送请求。如果文件未修改,你将看到304 Not Modified响应;如果文件已修改,则会看到200 OK响应。
而在非刷新情况下,缓存文件将显示200 OK状态,但如果你查看网络面板的大小/内容列,你会看到(from cache)字样。
如果Expires
头不符合RFC规定的有效日期格式,Google Chrome将会忽略它。例如,Chrome总是要求以双数字表示天数。例如5月1日应该设置为“01 May”(而不是“1 May”)等等。而Firefox则会接受这种头部,这会误导用户认为问题出在浏览器(即Chrome)而不是头部数值本身。
因此,如果您手动设置到期日期(而不使用mod_expires
或类似方法来计算实际日期),我建议您使用REDbot检查您的静态文件头。
Expires
和Max-Age
设置为几十年,那么您是在要求浏览器缓存该资源并且永远不检查它是否已更新?当它能够缓存资源时,它会进行缓存,但当需要刷新页面时,它希望确保整个页面都被刷新。其他浏览器肯定也会这样做(尽管有些浏览器有一个选项,可以等待几个小时再进行刷新)。If-Modified-Since
头的整个目的是允许服务器比较时间戳并返回“未修改”状态代码。这将对页面所需的每个资源都发生,但浏览器将能够同时发出所有请求并验证它们是否都没有更改。304未修改
,则刷新了该资源但不需要再次下载。如果您看到200 OK
,则已重新下载。If-Modified-Since
请求和304响应都会累加。将您的图像合并成精灵,以减少请求数量。听起来它试图通过向服务器询问图片自上次请求以来是否已更改来避免使用过时的缓存。这听起来是件好事,不是你想要阻止的事情。
假设您正在运行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头进行调整。网络上有很多关于此的好信息。