缓存过期控制与上次修改

2024-01-09

在阿帕奇的mod_expires模块,有Expires具有两个基准时间段的指令,access, and 修改.

ExpiresByType text/html "access plus 30 days"

可以理解,这意味着缓存将在 30 天后请求新鲜内容。

However,

ExpiresByType text/html "modification plus 2 hours"

没有直观意义。

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


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 才需要验证(使用最近的日期)。

(当然请注意,许多其他内容是与上面列出的两个标头一起发送的,为了简单起见,我只是删除了所有其余内容)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

缓存过期控制与上次修改 的相关文章

随机推荐