非幂等请求(如post、put、delete)必须显式禁止nginx缓存,通过proxy_cache_bypass配合map或location匹配实现;对含敏感参数、cookie或动态响应的请求也需动态绕过或禁用缓存,并添加x-cache-status头验证。

非幂等请求(如 POST、PUT、DELETE,或带敏感参数的 GET)默认不应进入 Nginx 代理缓存,否则会导致数据错乱、状态不一致甚至安全风险。Nginx 本身不会缓存这类请求的响应,但需主动配置策略来明确拦截、跳过或拒绝缓存,不能依赖默认行为。
明确禁止非幂等方法缓存
Nginx 默认不缓存含 Authorization 头或 Set-Cookie 响应的请求,但对请求方法本身不做限制。必须显式拦截非幂等方法:
- 在
location块中使用proxy_cache_bypass强制跳过缓存:proxy_cache_bypass $request_method;配合map将非幂等方法映射为非空值,例如:map $request_method $no_cache { POST "1"; PUT "1"; DELETE "1"; default ""; }
再写proxy_cache_bypass $no_cache; - 更稳妥的做法是直接拒绝缓存这些路径:用
if或location匹配方法 + 路径,关闭proxy_cache指令:location ~ ^/(api|submit|admin) { proxy_cache off; }
按参数或 Cookie 动态绕过缓存
很多非幂等行为藏在查询参数或用户上下文中,需结合业务逻辑识别:
- 用
proxy_cache_bypass检查关键变量:proxy_cache_bypass $arg_nocache $cookie_admin $http_x_no_cache;
只要任一变量非空,就跳过缓存 - 对登录态敏感接口,可检查会话标识:
proxy_cache_bypass $cookie_sessionid $arg_token;
避免将用户专属响应误缓存并返回给他人
避免缓存副作用明显的响应
即使请求是 GET,若响应含动态状态(如实时订单数、未读消息),也不应缓存:
- 禁用后端返回的缓存头干扰:
proxy_ignore_headers Cache-Control Expires Set-Cookie;
防止上游错误设置Cache-Control: public导致误缓存 - 强制对特定路径设极短有效期或禁用:
location /user/dashboard { proxy_cache_valid 200 1s; }
或直接设为 0:proxy_cache_valid 200 0s;
验证与防护机制
仅靠配置不够,需可观测和兜底:
- 始终添加调试头:
add_header X-Cache-Status $upstream_cache_status;
确保 POST 请求返回MISS或BYPASS,而非HIT - 配合日志记录可疑缓存行为:
在log_format中加入$upstream_cache_status $request_method $request_uri
定期排查是否出现HIT+POST的组合 - 对关键接口(如支付回调、Webhook)建议彻底关闭缓存:
proxy_cache off;+expires -1;+add_header Cache-Control "no-store, no-cache";











