多应用共享域名时应按路径精准隔离缓存策略:/static/设长期缓存,/api/禁用缓存,/v1/等版本路径实现天然隔离,避免查询参数干扰,优先通过路径版本化与文件哈希控制缓存。

多应用共享同一域名(如 app.example.com)时,浏览器缓存控制的关键不是“共享缓存”,而是**按路径精准隔离与差异化设置**。Nginx 本身不干预浏览器缓存行为,但可通过响应头(Cache-Control、Expires 等)向浏览器明确传达每个路径的缓存策略,从而实现灵活控制。
用 location 分段定义缓存头
不同应用路径(如 /admin/、/api/、/static/、/v2/)应各自配置独立的缓存策略,避免一刀切:
-
location ^~ /static/:静态资源设长期缓存,例如add_header Cache-Control "public, max-age=31536000, immutable"; -
location ^~ /api/:动态接口禁用缓存或设极短时效,例如add_header Cache-Control "no-cache, no-store, must-revalidate"; -
location = /index.html或location ^~ /v1/:HTML 入口文件建议协商缓存(ETag+Cache-Control: max-age=0),或配合版本路径使用immutable -
location ~* \.(js|css|png|jpg|gif|woff2?)$:可作为兜底规则,统一设强缓存,但优先级低于更具体的^~匹配
路径即缓存边界:强制版本化部署
浏览器以完整 URL 为缓存键。只要把应用版本体现在路径中(如 /v1/、/v2/、/prod/),就天然实现缓存隔离:
- 前端构建时,将
publicPath或homepage设为/v2/,确保所有资源请求带版本前缀 - Nginx 中用
alias映射物理目录:location ^~ /v2/ { alias /var/www/app-v2/; } - 上线新版本只需切换软链接(如
ln -sf /var/www/releases/20260820-v2 /var/www/app-v2),旧缓存不受影响,新路径自动启用新缓存
避免查询参数干扰缓存一致性
不要依赖 ?v=1.2.3 或 ?t=1724189400 控制浏览器缓存:
- CDN 和部分代理可能忽略或剥离查询参数,导致缓存未更新
- 浏览器虽会缓存带参 URL,但参数易被前端代码动态拼接,造成大量重复缓存项
- 真正需要刷新时,应改用路径变更(如从
/v1/切到/v2/)或修改文件名哈希(app.a1b2c3.js)
配合后端响应头做精细协同
若后端已返回 Cache-Control,Nginx 可选择覆盖或保留:
- 用
proxy_hide_header Cache-Control隐藏后端头,再由 Nginx 统一注入 - 用
proxy_pass_request_headers off+proxy_set_header完全接管请求头(慎用,可能影响后端鉴权) - 对特定路径(如
/admin/)加add_header X-App "admin",便于监控和调试缓存来源











