proxy_cache_methods用于指定可被缓存的http请求方法,默认仅get和head,需显式添加post等方法并配合proxy_cache、proxy_cache_key、proxy_cache_valid等指令才能生效。

proxy_cache_methods 的作用是告诉 Nginx:哪些 HTTP 请求方法的响应可以被缓存。它本身不开启缓存,也不决定缓存是否生效,只是“放行闸门”——只有列在这里的方法,才有可能进入后续缓存流程(前提是其他条件也都满足)。
默认值是 GET HEAD,也就是说,Nginx 天然只考虑缓存这两种请求的响应。你要缓存别的方法(比如 POST),就得显式写出来。
✅ 基础写法:声明支持的方法
在 location 或 server 块中配置,必须和 proxy_cache 指令配合使用:
location /api/search {
proxy_cache my_cache;
proxy_cache_methods GET HEAD POST;
proxy_pass https://backend;
}
- 支持的方法只能是标准 HTTP 方法:
GET、HEAD、POST(部分版本也支持PUT/DELETE,但极不推荐)。 -
PURGE、OPTIONS、自定义方法(如CACHE-REFRESH)不能直接写进proxy_cache_methods,Nginx 会忽略或报错。
⚠️ 缓存 POST 的三个硬性前提
光加 POST 不够,必须同时满足:
-
proxy_cache已绑定有效缓存区(如my_cache对应proxy_cache_path中定义的keys_zone) -
proxy_cache_valid明确覆盖 POST 返回的状态码(例如200、201) -
proxy_cache_key能区分不同请求内容(否则所有 POST 都挤进同一个缓存条目)
? 关键配套配置(缺一不可)
1. 缓存键必须含方法或请求体
防止 GET /data 和 POST /data 互相污染:
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";
如果要区分不同 POST 内容,还需加入 $request_body(需确保 proxy_buffering on 且 client_max_body_size 足够):
proxy_cache_key "$scheme$request_method$host$request_uri$args$request_body";
2. 显式设置响应缓存时长
POST 默认不会被 proxy_cache_valid 200 10m; 覆盖,除非你单独声明:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
proxy_cache_valid 200 201 302 10s; proxy_cache_valid 404 1m;
3. 控制哪些 POST 不该缓存
避免带用户身份、调试参数、CSRF Token 的请求进缓存:
proxy_no_cache $cookie_session $arg_debug $http_x_no_cache; proxy_cache_bypass $arg_nocache;
4. 忽略后端返回的禁用头(按需)
如果后端总返回 Cache-Control: no-cache 或 Set-Cookie,而你知道这些响应其实可缓存:
proxy_ignore_headers Cache-Control Expires Set-Cookie;
注意:仅适用于无用户态、无敏感数据的查询类接口(如搜索、GraphQL、配置获取)。
❌ 常见错误
- 在
http块全局配置proxy_cache_methods POST→ 容易误伤登录、下单等非幂等接口 - 只加
proxy_cache_methods POST,没配proxy_cache_key→ 所有 POST 共享一个缓存,响应错乱 - 没设
proxy_cache_valid对应状态码 → POST 返回200也不会被缓存 - 请求体过大导致
$request_body为空 → 缓存键失效,建议搭配client_body_buffer_size 128k;和proxy_buffering on;
✅ 验证是否生效
加一行响应头方便调试:
add_header X-Cache-Status $upstream_cache_status;
然后用 curl 发两次相同 POST 请求,观察:
- 第一次返回
X-Cache-Status: MISS - 第二次返回
X-Cache-Status: HIT - 同时后端 access log 只记录一次调用
这就说明 POST 缓存已正确启用。
不复杂但容易忽略。










