以“修改”为基础的Expires* 指令指的是服务器上文件的修改时间。因此,如果您设置“修改加 2 小时”,则任何在文件修改后 2 小时内(在服务器上)请求内容的浏览器都会缓存该内容,直到文件修改时间后 2 小时。并且浏览器知道那个时间是什么时候,因为服务器发送了一个带有正确过期时间的Expires 标头。
让我用一个例子来解释一下:假设你的 Apache 配置包括这一行
ExpiresDefault modification plus 2 hours
并且您在服务器上有一个文件index.html,ExpiresDefault 指令适用于该文件。假设您在格林威治标准时间 9:53 上传了 index.html 的一个版本,覆盖了之前存在的 index.html(如果有的话)。所以现在index.html的修改时间是格林威治标准时间9:53。如果您在服务器上运行 ls -l(或在 Windows 上运行 dir),您会在列表中看到它:
-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 才需要验证(使用最近的日期)。
(当然请注意,我上面列出的两个标头会同时发送许多其他内容,为简单起见,我只是删除了所有其他内容)