要让机密支付接口完全不缓存,必须精确匹配路径、隐藏后端缓存头、用always强制注入no-store等指令,并补充proxy_no_cache防御。

要让机密支付接口(如 /api/payment/submit)在浏览器和中间代理中完全不缓存,关键不是简单加一句 add_header Cache-Control "no-store",而是确保这个头真正生效、不被覆盖、不被忽略,并覆盖所有可能的响应路径。
核心目标只有一个:让浏览器和任何缓存层都明确知道——这条响应禁止任何形式的存储。
必须匹配支付接口路径并隔离配置
只对具体敏感路径启用策略,避免误伤其他资源。用精确匹配或正则定位:
location = /api/payment/submit {
proxy_pass http://backend;
# 或 fastcgi_pass /var/run/php.sock; (根据后端类型选)
}
不要写成 location /api/ 这种宽泛匹配,否则所有 API 都被强限制,影响性能与语义合理性。
先清除上游干扰,再注入权威头
后端(如 PHP、Node.js)很可能自带 Cache-Control: public 或 max-age=300,Nginx 默认不会覆盖它,只会并存——而浏览器取第一个,往往就是后端的。
正确做法是两步:
- 隐藏后端缓存头(防止抢跑)
- 强制注入且确保覆盖
location = /api/payment/submit {
proxy_pass http://backend;
# 关键:屏蔽后端返回的 Cache-Control、Expires、Pragma
proxy_hide_header Cache-Control;
proxy_hide_header Expires;
proxy_hide_header Pragma;
# 关键:用 always 强制注入,覆盖行为由 Nginx 内部逻辑保障(≥1.7.5)
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0" always;
add_header Pragma "no-cache" always;
add_header Expires "0" always;
}
✅
always参数必不可少:它让头出现在 4xx/5xx 错误响应中,也确保在 proxy 场景下抑制上游同名头输出;没有它,失败响应或重定向时头可能丢失。
补充防御:禁用缓存决策权交给代理
某些 CDN 或企业网关会忽略 no-store,但尊重 proxy_no_cache 指令。可额外加固:
# 在同一 location 块内追加 proxy_no_cache $http_pragma $http_authorization; proxy_cache_bypass $http_pragma $http_authorization;
这两行告诉 Nginx:只要请求带 Pragma 或 Authorization 头(支付请求必带),就跳过本地缓存检查、也不存结果——从源头切断缓存可能性。
验证是否生效
部署后,用 curl 检查响应头:
curl -I https://yoursite.com/api/payment/submit
应看到:
Cache-Control: no-store, no-cache, must-revalidate, max-age=0 Pragma: no-cache Expires: 0
且不能出现第二个 Cache-Control 头。若存在两个,说明 proxy_hide_header 缺失或 always 未启用。
不复杂但容易忽略。











