以“修改”为基础的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 之后),因此它会尝试验证该页面,并向服务器发送带有 If 的请求-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:00 = 13:57 GMT。)
现在直到 13:57 才需要验证(使用最近的日期)。
(当然请注意,许多其他内容与我上面列出的两个标头一起发送,为简单起见,我只是删除了所有其他内容)