Apache 默认对静态文件自动启用 Last-Modified 条件缓存验证:响应头含 Last-Modified(基于文件 mtime),浏览器后续请求带 If-Modified-Since,服务器比对时间后返回 304 或 200;精度为秒级,依赖时钟同步,不适用于默认动态内容,且 ETag 存在时优先校验。
apache 通过 last-modified 实现基于时间的缓存失效验证,本质是启用 http 协议定义的“条件请求”机制,不需要额外模块,默认对静态文件(如 html、css、js、图片)就自动生效。
Apache 默认行为:自动设置 Last-Modified 响应头
只要文件系统中资源真实存在,且 Apache 有读取权限,它会在响应中自动添加 Last-Modified 头,值为该文件在磁盘上的最后修改时间(GMT 格式,遵循 RFC 1123)。例如:
这个行为由核心模块控制,无需手动配置。浏览器收到后会连同资源一起缓存该时间戳。
客户端再次请求时触发 If-Modified-Since 验证
当用户刷新页面或重新访问同一 URL,且本地已有缓存副本时,现代浏览器会自动在请求头中带上:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
Apache 收到该请求后,会做以下判断:
- 读取目标文件当前的
mtime(最后一次修改时间) - 比较
If-Modified-Since时间是否 ≥ 文件当前mtime - 如果成立 → 返回
304 Not Modified,不发响应体,浏览器复用本地缓存 - 如果不成立(即文件确实被更新过)→ 返回
200 OK和新内容,并更新响应头中的Last-Modified
关键细节与注意事项
这个机制虽简单,但有几个实际影响效果的关键点:
- 时间精度仅到秒级:同一秒内多次修改文件,Apache 可能无法感知变化,导致本该更新却返回 304
- 依赖服务器时钟准确:若服务器时间快于/慢于客户端,可能造成误判(如始终返回 304 或始终返回 200)
- 不适用于动态内容:PHP/SSI 等生成的页面默认不会自动设置
Last-Modified,需在脚本中手动输出该头 - ETag 优先级更高:若 Apache 同时启用了 ETag(默认开启),且两者都存在,它会先校验 ETag;只有 ETag 不匹配时才回退到
Last-Modified比较 - 可被显式禁用:通过
FileETag None关闭 ETag 后,Last-Modified就成为唯一验证依据
如何确认是否生效
用浏览器开发者工具(Network 标签页)检查任意静态资源的响应头,查找 Last-Modified;再发起一次请求,查看请求头是否含 If-Modified-Since,以及响应状态码是否为 304。也可用 curl 快速验证:
curl -I -H "If-Modified-Since: [上面拿到的时间]" https://yoursite.com/style.css

















