apache默认不缓存动态内容,安全防护核心是防止错误缓存、敏感信息泄露及确保响应头正确;应禁用mod_cache相关模块,统一注入cache-control头,谨慎控制可缓存接口,并避免mod_expires误配动态内容。

Apache 本身不缓存动态内容(如 PHP、Python WSGI 输出),默认跳过缓存——这是安全前提。所谓“保护动态内容的缓存安全”,核心是防止错误缓存、避免敏感信息泄露、确保客户端或中间代理按预期行为处理响应,而非让 Apache 自行缓存。
禁用不必要的缓存模块
多数动态站点无需 mod_cache。若未主动启用反向代理缓存,应确认以下模块未加载:
- 检查 mods-enabled/ 目录下无
cache.load、cache_disk.load - 运行
a2query -m cache和a2query -m cache_disk,输出应为 “Not found” - 若已启用且非必需,执行
a2dismod cache cache_disk并重启 Apache
统一注入安全的 Cache-Control 头
后端脚本(如 PHP)常遗漏或误设缓存头。Apache 可用 mod_headers 强制覆盖,确保动态响应不被意外缓存:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 对所有 .php 文件:禁止任何缓存,清除可能干扰的头
<filesmatch><br> Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0"<br> Header unset ETag<br> Header unset Last-Modified<br></filesmatch>
- 对含用户身份的路径(如
/account/、/api/user),额外添加private或no-cache,并禁用Set-Cookie缓存(即使 Apache 不缓存,也要声明策略)
谨慎对待可缓存的动态接口
仅当明确设计为“只读+无状态+时效宽松”的接口(如公开天气数据、统计看板),才考虑短期缓存:
- 使用
<location></location>按路径精确控制,避免全局误配 - 设置
public, max-age=60, stale-while-revalidate=30,不带Set-Cookie或Vary: Cookie - 绝不缓存含
Authorization、Cookie、Session-ID的响应;若必须传递认证头,需配合CacheIgnoreHeaders Set-Cookie(仅限启用 mod_cache 时) - 始终验证后端是否真正输出了可缓存内容(例如,PHP 中未调用
session_start()、未写入Set-Cookie)
关闭危险的兜底行为
避免用 mod_expires 统一设置动态内容过期时间——它基于文件类型,容易误伤:
- 禁用
ExpiresByType text/html "access plus 1 hour"这类规则,除非你 100% 确认所有 .html 都是静态页面 - 若需 expires 功能,仅用于明确的静态资源路径(如
<location></location>) - 删除配置中类似
ExpiresDefault对动态路径生效的语句










