2012-03-10 57 views
0

如何使浏览器缓存资源(如图像),并使用命令告诉浏览器不要检查更新的文件?我拥有永远不会改变的静态资产,不断要求服务器进行更新是一种浪费。apache缓存控制无需验证

回答

1

我的主人不声明favicon.ico的文件,图像/ X-图标,所以我需要以下

AddType image/x-icon .ico 

您设置到期如下,每种类型之一。下面是一个例子集(您可以使用天,周,月等。

ExpiresActive On 
ExpiresByType text/css  "access plus 1 month" 
ExpiresByType text/javascript "access plus 1 month" 
ExpiresByType image/gif  "access plus 1 week" 
ExpiresByType image/png  "access plus 1 week" 
ExpiresByType image/x-icon "access plus 1 week" 

您可能还希望设置缓存头

<FilesMatch "\.(css|js|gif|jpe?g|png|ico)$"> 
    Header add "Cache-Control" "public, max-age=604800" 
</FilesMatch> 

所需的其他类型的扩展604800 = 1周秒。如果你想改变这个你算算。

浏览器如何使用这些头

RFC 2616 (HTTP/1.1)规定了何时以及如何b的框架建议罗尔斯使用这些信息。要深入了解实际情况,请使用Google Chrome开发者视图(Ctl + Shft + I)网络标签。 (尽管可能通过扩展包,但大多数其他主流浏览器都提供相同的工具。)但是,这是建议性的,用户可以选择忽略此选项,但它们总是选择检查服务器,或者每个会话检查一次服务器。 IIRC,一些早期的浏览器(例如MSIE 8)每次会话都有一次检查作为默认选项。

此外,如果你选择做一个刷新页面,那么大多数浏览器将重新验证在页面上使用的所有资源如果-Modified-Since的如果 - 无 - 匹配,所以你需要重新链接或重新输入URI以查看正常重用操作。同样,大多数人会将Shift +刷新视为“强制刷新” - 即不进行协商。

当我管理OpenOffice.orf用户论坛时,我曾经分析过整个月份的访问日志,看看有多少缓存是通过使用简单的算法来确定何时重用资源应该被缓存,但仍然被客户端浏览器。我惊讶地发现这个缓存未命中率超过了30%(由于用户的浏览器设置)。然而,大多数用户使用谷歌作为知识库访问这些用户论坛,询问具体问题,然后查看几页,从不在本月内返回。当我将自己限制在主持人的IP(主要使用Ff或Chrome作为他们的浏览器)时,此速率提高到〜95%。

因此,客户端浏览器使用此信息,但没有你所期望的那么多。我还讨论了here,当你没有明确请求这个时,浏览器也可以缓存资源。

+0

我知道如何缓存。我想告诉服务器甚至不要检查更新的版本。 – LordZardeck 2012-03-11 04:41:20

+0

@LordZardeck,你的愿望是不合逻辑的。 mod_expires在文件上执行'lstat()'。鉴于这是它将要读取的文件,这与已经在文件系统缓存中缓存的inode的lstat相当。这花费几百微秒。如果没有兑现,读取本身可能需要100毫秒或更多。您无法使用mod_expires将来设置绝对日期。当然,您可以放下标题并让浏览器执行cond'l GET。解决这个问题! ; - ? – TerryE 2012-03-11 05:13:49

+0

此外,如果你想“服务器甚至不检查”,然后改变你的问题。你说“告诉*浏览器* ...“顺便说一句,”访问加1个月“意味着浏览器在重新验证之前将在下个月使用本地缓存副本。如果您不喜欢,那么将”access + 10 years“或其他相同的东西放在一起。 – TerryE 2012-03-11 05:18:42