apache - 具有上次修改的缓存过期控制

标签 apache caching browser mod-expires

在 Apache 的 mod_expires模块,有Expires具有两个基本时间段的指令,访问 , 和 修改 .

ExpiresByType text/html "access plus 30 days"

可以理解的是,缓存将在 30 天后请求新内容。

然而,
ExpiresByType text/html "modification plus 2 hours"

没有直觉意义。

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

最佳答案

一个 Expires*以“修改”为基础的指令是指服务器上文件的修改时间。因此,如果您设置“修改加 2 小时”,则任何在文件修改后 2 小时内(在服务器上)请求内容的浏览器都会缓存该内容,直到文件修改时间后 2 小时。并且浏览器知道那个时间是什么时候,因为服务器发送了 Expires具有适当过期时间的 header 。

让我用一个例子来解释一下:假设您的 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 header 的时间等于文件的修改时间 (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 header 。将返回没有正文的 304(未修改)响应,因为该页面的日期自首次提供以来未更改。由于过期日期已过——该页面已“过时”——随后每次访问该页面时都会发出验证请求,直到验证失败。

现在,让我们假设您在 11:57 上传了新版本的页面。在这种情况下,浏览器在 12:00 尝试验证页面的旧版本失败,并且它在响应中收到与新页面一起的以下两个新 header :
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 才需要验证(使用最近的日期)。

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

关于apache - 具有上次修改的缓存过期控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/562802/

相关文章:

PHP-FPM FilesMatch 和 ProxyPassMatch 可互换性?

linux - 为 Linux 托管服务器添加 MIME 类型 (GoDaddy)

Javascript 取消浏览器最大化

javascript - 为什么可配置:false allows to change writable flag but does'nt for enumerable

python - Python 有 8KiB 字节长的文件 I/O 缓存吗?

javascript - PapaParse 如何从 http 流式传输?

android - 从 Apache 服务器在 Android 上播放 MP4 视频时出现问题

php - 如何在 wordpress 网站中放置 zend 框架应用程序

javascript - 如何过滤 chrome devtools 中的缓存请求?

ruby-on-rails - Rails 是否有使缓存过期的标签?