An Expires*
以“modification”为基础的指令是指文件在服务器上的修改时间。因此,如果您设置“修改加 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
如果浏览器发出此请求的时间是在 GMT 11:53 之前,则浏览器将缓存该页面,因为该页面尚未过期。因此,如果用户首先在 11:00 GMT 访问该页面,然后在 11:30 GMT 再次访问同一页面,浏览器将看到其缓存版本仍然有效,并且不会(或者更确切地说,不允许) ) 发出新的 HTTP 请求。
如果用户在 12:00 GMT 第三次访问该页面,浏览器会发现其缓存版本现已过期(11:53 之后),因此它会尝试验证该页面,并向服务器发送带有 If 的请求-修改-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:00 = 13:57 GMT。)
现在直到 13:57 才需要验证(使用最近的日期)。
(当然请注意,许多其他内容是与上面列出的两个标头一起发送的,为了简单起见,我只是删除了所有其余内容)