当前位置:  开发笔记 > 前端 > 正文

具有最后修改的缓存过期控制

如何解决《具有最后修改的缓存过期控制》经验,为你挑选了1个好方法。

在Apache的mod_expires模块中,有一个Expires指令有两个基本时间段,访问修改.

ExpiresByType text/html "access plus 30 days"

可以理解的是,缓存将在30天后请求新鲜内容.

然而,

ExpiresByType text/html "modification plus 2 hours"

没有直觉意义.

除非向服务器发出请求,否则浏览器缓存如何知道文件已被修改?如果它正在调用服务器,缓存此指令有什么用?在我看来,我不理解缓存的一些关键部分.请赐教.



1> David Z..:

Expires*以"修改"为基础的指令是指服务器上文件的修改时间.因此,如果您设置"修改加2小时",则在文件修改后2小时内(在服务器上)请求内容的任何浏览器都会将该内容缓存到文件修改时间后2小时.并且浏览器知道该时间何时是因为服务器发送Expires具有适当到期时间的标头.

让我用一个例子来解释一下:说你的Apache配置包括该行

ExpiresDefault modification plus 2 hours

和你有一个文件index.html,其中的ExpiresDefault指令适用于在服务器上.假设您index.html在格林尼治标准时间9:53 上传了一个版本,覆盖了以前的现有版本index.html(如果有的话).所以现在修改时间index.html是格林威治标准时间9点53分.如果您ls -l在服务器(或dirWindows)上运行,您将在列表中看到它:

-rw-r--r--  1 apache apache    4096  Feb 18 09:53 index.html

现在,对于每个请求,Apache都会发送包含Last-Modified文件最后修改时间的标头.由于你有这个ExpiresDefault指令,它也会发送Expires标题,其时间等于文件的修改时间(9:53)加上两个小时.所以这是浏览器看到的部分内容:

Last-Modified: Wed, 18 Feb 2009 09:53:00 GMT
Expires: Wed, 18 Feb 2009 11:53:00 GMT

如果浏览器发出此请求的时间是格林威治标准时间11:53之前,则浏览器将缓存该页面,因为它尚未过期.因此,如果用户首先在格林威治标准时间11:00访问该页面,然后在格林威治标准时间11:30再次访问同一页面,则浏览器将看到其缓存版本仍然有效且不会(或者更确切地说,不允许)发出新的HTTP请求.

如果用户在格林尼治标准时间12:00第三次访问该页面,浏览器会看到其缓存版本现已过期(它是在11:53之后),因此它会尝试验证该页面,并向服务器发送一个请求. -Modified-Since标头.由于页面的日期自首次提供以来未被更改,因此将返回没有正文的304(未修改)响应.由于到期日期已经过去 - 页面是"陈旧的" - 每次访问页面时都会发出验证请求,直到验证失败.

现在,让我们假装你在11:57上传了一个新版本的页面.在这种情况下,浏览器尝试在12:00验证旧版本的页面失败,并且它在响应中以及新页面接收这两个新标题:

Last-Modified: Wed, 18 Feb 2009 11:57:00 GMT
Expires: Wed, 18 Feb 2009 13:57:00 GMT

(该文件的最后修改时间变后的新版本的上传11时57分,和Apache计算期满时间为11点57 + 2点= 13时57 GMT).

在13:57之前不需要验证(使用更近的日期).

(当然,需要注意的是很多其他的事情都与两个头我上面列出一起发送,我只是修剪了所有简单的其余部分)

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有