在Apache的mod_expires
模块中,有一个Expires
指令有两个基本时间段,访问和修改.
ExpiresByType text/html "access plus 30 days"
可以理解的是,缓存将在30天后请求新鲜内容.
然而,
ExpiresByType text/html "modification plus 2 hours"
没有直觉意义.
除非向服务器发出请求,否则浏览器缓存如何知道文件已被修改?如果它正在调用服务器,缓存此指令有什么用?在我看来,我不理解缓存的一些关键部分.请赐教.
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
在服务器(或dir
Windows)上运行,您将在列表中看到它:
-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之前不需要验证(使用更近的日期).
(当然,需要注意的是很多其他的事情都与两个头我上面列出一起发送,我只是修剪了所有简单的其余部分)