缓存过期控制与上次修改

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(使用前将#替换为@)

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

  • Intel 64 和 IA-32 上的 MESI 有何意义

    MESI 的要点是保留共享内存系统的概念 然而 对于存储缓冲区 事情就变得复杂了 一旦数据到达 MESI 实现的缓存 下游内存就会保持一致 然而 在此之前 每个核心可能对内存位置 X 中的内容存在分歧 具体取决于每个核心的本地存储缓冲区中的
  • PHP:如何访问根目录之外的下载文件夹? [复制]

    这个问题在这里已经有答案了 我如何创建一个 PHP 脚本 页面 允许会员 买家下载存储在根目录之外的下载文件夹中的压缩文件 产品 我正在使用 Apache 服务器 请帮忙 谢谢 保罗 G 您可能会在 soac 提供的链接中找到一些更好的信息
  • 配置 shiro.ini 以进行 JDBC 连接

    作为我新的一年学习新技术计划的一部分 我开始尝试使用 Apache Shiro 安全框架 我设法让基本示例正常工作 该示例将用户名 密码和角色存储在 shiro ini 文件中 但是当我修改 shiro ini 文件以使用 JDBC 时 它
  • Internet Explorer 8 + 放气

    我有一个非常奇怪的问题 我真的希望有人能给出答案 因为我不知道还能去哪里问 我正在用 C 编写一个 cgi 应用程序 它由 Apache 执行并输出 HTML 代码 我自己在 C 应用程序中压缩 HTML 输出 因为我的 Web 主机由于某
  • 如何让 PDF 内容(由 Spring MVC 控制器方法提供)显示在新窗口中

    我是 Spring MVC 的新手 但它的功能给我留下了深刻的印象 我正在使用 3 1 0 RELEASE 并且我必须显示 PDF 来响应 form form 提交 这是我在控制器中编写的 小 代码 RequestMapping value
  • 在 SPA 中加载外部脚本和样式文件

    我有一种 SPA 它使用 API 来获取数据 该 SPA 有一些实例 它们都使用通用样式和脚本文件 所以我的问题是 当我更改这些文件中的一行时 我将必须打开每个实例并更新文件 这对我来说真的很耗时 一种方法是将这些文件放在服务器中的文件夹中
  • SSE(EventSource):为什么不超过6个连接?

    我想看看在我的机器超载之前我可以设置多少个并发 SSE 又名 EventSource 连接 但使用 Firefox Firefox 18 或 Firefox 20 进行测试时 它在 6 个连接处停止 附加连接没有给出错误 但不发送任何数据
  • 从 Apache 运行 python 脚本的最简单方法

    我花了很长时间试图弄清楚这一点 我基本上正在尝试开发一个网站 当用户单击特定按钮时 我必须在其中执行 python 脚本 在研究了 Stack Overflow 和 Google 之后 我需要配置 Apache 以便能够运行 CGI 脚本
  • 将应用程序级别用户名/用户 ID 注入 nginx/Apache 日志

    有没有办法将应用程序级别的用户名或 id 在本例中为 django 用户名或 id 注入 Apache 或 ngnix 日志中 请注意 我不是询问 HTTP 身份验证用户名 我目前正在使用一个简短的自定义中间件将此数据添加到响应标头 如下所
  • Ubuntu 12.04 上的 PHP 从 5.3 升级到 php 5.6

    我正在按照本教程将 php 从版本 5 3 升级到 5 6 http phpave com upgrade php 53 to php 56 on ubuntu 1204 lts http phpave com upgrade php 53
  • PHP 文件由浏览器下载,而不是由本地开发服务器(MAMP)处理

    一切都很顺利 直到我添加AddHandler application x httpd php5s php到本地服务器文档根目录中的 htaccess 文件 根据我正在使用的站点 我经常更改该文件 因为我访问时这样做了http 本地主机 88
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • 使 Django 1.3.1 中的视图缓存过期

    我正在尝试使模型上的视图级缓存过期post save 这是通过设置的https docs djangoproject com en 1 3 topics cache from olddocs the per view cache https
  • Apache:重定向用户,但保持相同的路径?

    我希望能够将用户重定向到不同的 TLD 但保持相同的路径 例如 如果用户访问 example com cars 10 使用 apache 如何将用户重定向到类似以下内容 my new site com cars 10 如果您的服务器启用了
  • 如何使 Redis 缓存中数据层次结构(树)的部分内容无效

    我有一些产品数据 需要在 Redis 缓存中存储多个版本 数据由 JSON 序列化对象组成 获取普通 基本 数据的过程很昂贵 将其定制为不同版本的过程也很昂贵 因此我想缓存所有版本以尽可能进行优化 数据结构看起来像这样 BaseProduc
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • PHP 启动:无法加载动态库 php5.4.3/ext/php_ffmpeg.dll 不是有效的 Win32 应用程序

    再会 我尝试在 Windows 7 计算机上安装 dll 文件 php ffmpeg 但不断收到此错误 29 Jan 2013 11 37 00 UTC PHP Warning PHP Startup Unable to load dyna
  • 在浏览器中查看 javascript 事件

    我正在使用火狐浏览器 有没有什么东西可以向我显示实时触发的所有 JavaScript 事件 您可以右键单击其中的元素Firebug http getfirebug com的 HTML 选项卡并单击日志事件 然后 您将在 控制台 选项卡中看到
  • Apache 反向代理的基本身份验证问题

    我想为在 Ubuntu 服务器 12 04 1 上运行的 Apache 反向代理站点添加基本身份验证 网络应用程序是Jenkins http jenkins ci org运行在 Java EE 容器上 我在中添加了以下配置httpd con
  • 使用 SERVER_NAME 时出现 Flask 404

    在我的 Flask 配置中 我将 SERVER NAME 设置为 app example com 之类的域 我这样做是因为我需要使用url for with external网址 如果未设置 SERVER NAME Flask 会认为服务器

随机推荐