网关层缓存应完全独立于后端:基于路径/哈希自主设置强缓存策略,禁用协商缓存,后端异常时仍可用过期缓存或本地副本。

要让网关层缓存真正“无视后端混乱配置、完全独立自主”,核心不是压服后端,而是绕过它——把缓存决策权从应用服务器手里彻底收回来,由网关自身基于资源特征做判断,不依赖后端返回的 Cache-Control、Expires 或 ETag 等字段。
用网关接管全部缓存生命周期
后端可能返回 Cache-Control: no-cache 或空头,甚至每次响应头都不一致。此时网关不能被动遵循,而应主动覆盖:
- 对所有静态资源路径(如
/static/.*\.(js|css|png|woff2))强制注入Cache-Control: public, max-age=31536000, immutable - 对 HTML 入口文件(如
/index.html)统一设为Cache-Control: no-cache或max-age=0, must-revalidate,确保每次访问都校验 - 对 API 接口(如
/api/.*)默认禁用缓存:Cache-Control: no-store,除非明确标记为可缓存(例如带X-Cacheable: true响应头)
基于内容哈希实现 URL 级强缓存锁定
网关不信任后端是否改了内容,但信任文件名里的哈希值。只要 URL 含 .[contenthash].(如 app.8a3f2e1b.js),就认定该资源永久不变:
- Nginx 示例:匹配含哈希的静态资源路径,直接加 long-term 头并关闭协商
- 避免在网关层做 ETag 或 Last-Modified 校验——这些需后端配合,违背“独立自主”原则
- 若后端未生成 contenthash 文件名,可在构建阶段或网关前置脚本中重写响应体中的资源引用(如将
app.js替换为app.[hash].js),再配合静态资源重定向
隔离缓存策略与业务逻辑流
真正的自主性体现在:即使后端服务宕机、返回 500、或响应头全乱,网关仍能按预设规则服务缓存内容:
- 启用 Nginx 的
proxy_cache_use_stale,允许在后端异常时返回过期缓存(error timeout updating http_500) - 对已缓存的静态资源,即使后端返回 404,网关也照常返回本地副本(需配
proxy_intercept_errors off+ 精确 location 匹配) - 用
map指令根据 URI 后缀或路径前缀动态设置缓存区和过期时间,策略完全声明式,不耦合任何后端代码
拒绝协商缓存,只信强缓存+URL 变更
协商缓存(304)本质是向后端“请示”,违背“无视后端”的前提。自主网关应主动规避:
- 移除所有传给后端的
If-None-Match和If-Modified-Since请求头(proxy_set_header If-None-Match "") - 不转发 ETag / Last-Modified 响应头给客户端;网关自己生成的
ETag(如基于文件哈希)仅用于内部管理,不暴露 - 所有缓存失效只通过 URL 变更触发——这是唯一可靠、可验证、无需后端参与的信号










