Nginx 默认禁止缓存带认证凭据(如 Set-Cookie、Authorization)的响应,因其属用户私有且不可共享;需通过 proxy_ignore_headers 忽略相关响应头、proxy_cache_key 包含 $http_cookie 实现按用户隔离缓存,并配合 proxy_cache_methods 限制仅 GET/HEAD 缓存、proxy_no_cache/proxy_cache_bypass 控制绕过逻辑,确保安全与语义合理。

直接缓存带认证凭据(如 Set-Cookie、Authorization 相关响应)的响应内容,在 Nginx 中默认是**被禁止的**——因为这类响应通常属于用户私有、不可共享,Nginx 会主动忽略缓存。要实现“缓存带认证的响应”,本质是**有意识地绕过默认安全限制,并确保语义合理**,常见于内部系统、单用户网关或需加速登录后静态资源的场景。
必须先定义缓存区(http 块内)
这是所有 proxy_cache 的前提,且只能写在 http{} 块中:
proxy_cache_path /var/cache/nginx/auth levels=1:2 keys_zone=auth_cache:50m max_size=2g inactive=30m use_temp_path=off;- keys_zone 名称(如
auth_cache)后续 location 中必须严格匹配 -
use_temp_path=off推荐开启,避免写入延迟和跨文件系统拷贝
在 location 中启用缓存并显式处理认证头
默认情况下,只要响应含 Set-Cookie 或 Cache-Control: private/no-store,Nginx 就拒绝缓存。需用以下指令覆盖:
-
proxy_ignore_headers Set-Cookie "Cache-Control" "Expires";→ 主动忽略后端返回的这些响应头,不让它们阻断缓存 -
proxy_cache auth_cache;→ 绑定上一步定义的缓存区 -
proxy_cache_valid 200 201 302 10m;→ 明确为成功/重定向响应设定缓存时间(注意:401/403 一般不建议缓存,除非你确定要缓存“未授权”状态) -
proxy_cache_key "$scheme$request_method$host$request_uri$http_cookie";→ 把 Cookie 加入缓存键,确保不同用户请求不互相污染(适合按用户隔离缓存)
控制缓存绕过与安全性边界
即使启用了缓存,也要防止敏感操作被误缓存(比如 POST 提交表单、登出接口):
-
proxy_cache_methods GET HEAD;→ 仅允许 GET/HEAD 方法参与缓存(禁用 POST/PUT/DELETE) -
proxy_no_cache $arg_nocache $http_x_no_cache $cookie_admin_mode;→ 满足任一条件(如 URL 带?nocache=1,或请求头含X-No-Cache,或 Cookie 含admin_mode)时,**不写入缓存**(但响应仍发给客户端) -
proxy_cache_bypass $arg_nocache $http_x_no_cache;→ 同样条件触发时,**跳过读取缓存**(即强制回源),常与proxy_no_cache配合使用
验证与调试关键项
加响应头方便快速确认缓存行为是否生效:
-
add_header X-Cache-Status $upstream_cache_status;→ 返回HIT/MISS/BYPASS等状态 -
add_header X-Cache-Key $cache_key;→ 查看实际生成的缓存键,排查键重复或错位问题 - 检查缓存目录权限:
chown -R nginx:nginx /var/cache/nginx/auth,确保 Nginx 进程可读写


















