频繁变动内容需精准缓存而非长周期缓存,应按路径、后缀或响应头区分类型:对实时接口禁用磁盘缓存并设no-cache;对相对稳定内容设短TTL+ETag再验证;忽略干扰头如X-Request-ID;慎用查询参数忽略;利用Last-Modified和ETag实现304高效再验证;通过环境变量动态设置Cache-Control。
对频繁变动的内容(比如用户仪表盘、实时订单状态、个性化推荐等),直接启用长周期缓存反而会导致数据陈旧、用户体验下降甚至业务错误。优化的关键不是“多缓存”,而是“精准缓存”——在保证内容时效性的前提下,最大限度复用已有响应。
Apache 本身不识别业务逻辑,必须通过路径、文件后缀或响应头显式标记内容特性:
/api/v1/status),禁用磁盘缓存,仅允许浏览器做短时验证性缓存:<Location "/api/v1/status"><br> Header set Cache-Control "no-cache, must-revalidate"<br> Header unset ETag<br></Location>
Header set Cache-Control "max-age=300, must-revalidate",配合 FileETag MTime 让浏览器用 If-None-Match 请求验证是否变更Set-Cookie 或 Vary: Cookie 的响应启用 mod_cache_disk,否则可能缓存用户专属内容并错误返回给他人频繁变动内容常伴随动态头(如 X-Request-ID、X-Timestamp),若未忽略,Apache 默认会认为每次响应都不同,导致缓存失效:
<IfModule mod_cache_disk.c> 块中加入:CacheIgnoreHeaders X-Request-ID X-Timestamp X-Backend-Time
CacheIgnoreNoLastModOn,避免因后端未返回 Last-Modified 而跳过缓存CacheIgnoreQueryStringOn —— 若查询参数影响内容(如 ?user_id=123),忽略它会导致混用缓存;仅对无意义参数(如 ?v=20260615)才考虑忽略对变动频繁但变更不频繁的内容,比全量缓存更优的是“轻量再验证”。Apache 可自动生成这些头,无需应用层干预:
FileETag INode MTime Size(默认通常已开)header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $last_update_time) . ' GMT');
304 Not Modified,节省带宽和后端计算某些场景下,缓存策略需随请求上下文变化(如登录用户 vs 游客、移动端 vs PC端)。可通过环境变量+条件头实现:
SetEnvIf User-Agent "Mobile" IS_MOBILE=1
<IfDefine IS_MOBILE><br> Header set Cache-Control "max-age=60, public"<br></IfDefine><br><IfDefine !IS_MOBILE><br> Header set Cache-Control "max-age=120, public"<br></IfDefine>