核心是彻底禁用缓存写入能力:对POST/PUT/DELETE等写操作,强制proxy_no_cache 1和proxy_cache_bypass 1;隔离上传路径并proxy_cache off;响应头设no-store;防静态资源误缓存。

处理文件上传等写操作的缓存绕过,核心不是“允许绕过”,而是**彻底禁用缓存写入能力**——因为上传、提交、修改类请求天然不该进缓存,更不该被绕过机制意外触发缓存污染。
明确禁止写操作进入缓存
所有涉及状态变更的请求(POST /upload、PUT /api/user、DELETE /file)必须从缓存路径中排除:
- 在对应 location 块中强制设置 proxy_no_cache 1; 和 proxy_cache_bypass 1;,确保既不读缓存也不写缓存
- 避免依赖变量(如 $arg_nocache)控制,直接用常量 1,杜绝条件误判
- 检查后端响应头:若上传接口返回 Cache-Control: no-store 或 no-cache,确认 Nginx 未配置
proxy_ignore_headers Cache-Control,否则该指令会被忽略
隔离上传路径,避免缓存 key 污染
即使上传请求本身不缓存,若其 URI 与 GET 接口共用(如 /api/files?id=123),可能因缓存 key 设计不当导致响应错乱:
- 为上传路径单独定义 location,例如
location ^~ /upload/ { ... },并显式关闭缓存:proxy_cache off; - 若使用统一 proxy_cache_key,务必剔除影响写操作的变量(如
$request_body不可用,$http_cookie和$request_method必须纳入),确保 POST 和 GET 的 key 绝对分离 - 对上传成功后的跳转或响应(如 302 重定向到详情页),需确认重定向目标 URL 不带用户敏感参数(如 token、session_id),防止这些参数意外进入缓存 key
防御上传响应被错误缓存
上传完成返回的 JSON 响应(如 {"code":0,"url":"/uploads/a1b2c3.jpg"})虽是纯数据,但若含动态内容或临时凭证,仍不可缓存:
- 在上传 location 中添加:add_header Cache-Control "no-store, no-cache, must-revalidate";
- 配合 expires epoch; 强制过期时间归零
- 验证方式:用 curl 上传后查看响应头,确认无
Cache-Control: public或max-age,且$upstream_cache_status日志字段为 MISS 或直接不记录(因 proxy_cache off)
补充:上传文件本身不走 Nginx 缓存,但需防间接泄露
Nginx 的 proxy_cache 不缓存文件体(只缓存响应头+响应体),但上传后的静态资源(如图片)若被 Nginx 作为静态服务提供,就可能被缓存。此时要:
- 上传目录(如
/var/www/uploads/)不配置location ~ \.(jpg|png|gif)$缓存策略 - 若必须缓存上传资源,启用 auth_request 或 IP 白名单校验,确保只有授权请求能命中缓存
- 对上传资源访问路径加随机前缀或 token 参数(如
/u/a1b2c3.jpg?t=xxx),使每个链接唯一,天然规避缓存复用


















