必须同时启用 proxy_cache_bypass 和 proxy_no_cache 并共用同一开关变量,才能确保支付回调接口彻底跳过缓存读写;还需添加 cache-control 头、禁用重定向缓存等硬性约束,并通过响应头、日志及后端请求验证生效。

要确保支付回调接口绝不被缓存,不能只设 proxy_no_cache —— 它只管“不存”,不管“不读”。必须让请求跳过缓存查找、响应也不写入缓存,双保险才可靠。
按路径精准识别回调接口
支付回调通常有固定路径特征,比如 /pay/notify、/callback/alipay 或 /webhook/payment。用 map 提前提取路径信号,生成开关变量:
- 在
http块顶部定义:
map $request_uri $no_cache_for_payment {
~*^/pay/notify 1;
~*^/callback/ 1;
~*^/webhook/payment 1;
default 0;
}
正则匹配支持大小写不敏感,覆盖常见命名变体。
同时绕过读和写两个环节
在对应 location 块中,必须成对启用两个指令,并共用同一变量:
-
proxy_cache_bypass $no_cache_for_payment;→ 请求直接回源,不查缓存 -
proxy_no_cache $no_cache_for_payment;→ 响应绝不写入缓存
只要变量值为 1,两条指令立即生效。注意:这两个指令需与 proxy_cache 同级启用,否则无意义。
补充防误缓存的硬性约束
即便路径匹配失败,也要防止上游或客户端干扰导致意外缓存:
- 显式禁用基于 Cookie 或参数的缓存触发:
proxy_cache_bypass $cookie_sessionid $arg_nocache;(可选叠加) - 强制响应头声明不可缓存:
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0"; - 避免缓存重定向响应:
proxy_cache_valid 301 302 0s;(设为 0 秒即不缓存跳转)
验证是否真正生效
上线后可通过三步确认:
- 用
curl -I http://your-domain.com/pay/notify查看响应头中是否有X-Cache: MISS或类似标识(取决于你启用了缓存日志) - 检查 Nginx error log 是否出现
cache miss或bypass cache相关记录 - 主动触发回调并观察后端日志 —— 若每次都有新请求抵达,说明未命中缓存











