proxy_cache_methods 用于指定可缓存的HTTP方法,默认仅GET/HEAD;需配合proxy_cache_valid、proxy_cache_key(建议含$request_method)及proxy_no_cache等指令协同生效,否则POST等方法无法安全缓存。

proxy_cache_methods 用于指定哪些 HTTP 请求方法可以被缓存,它本身不决定是否启用缓存,而是配合 proxy_cache 和 proxy_cache_valid 等指令,控制“哪些请求的响应允许进入边缘缓存”。
默认只缓存 GET 和 HEAD 请求。若需对 POST、PUT、DELETE 等方法也做缓存(例如某些幂等接口或预生成资源),必须显式配置 proxy_cache_methods,并确保后端响应头(如 Cache-Control)或 Nginx 的 proxy_cache_valid 明确允许缓存。
✅ 正确开启特定请求方式的缓存加速
1. 明确声明支持的请求方法
在 location 或 server 块中添加:
proxy_cache_methods GET HEAD POST;
这表示:当请求是 GET、HEAD 或 POST 时,Nginx 才会考虑将其响应写入缓存(前提是其他缓存条件也满足)。
⚠️ 注意:
POST默认不可缓存,因为语义上通常是非幂等操作。只有在你确认该POST接口行为确定、响应稳定且可复用(如/api/v2/render?template=report),才建议开启。
2. 配合 proxy_cache_valid 指定响应缓存时长
仅声明方法还不够,还需告诉 Nginx “哪些状态码的响应、对应哪些方法,缓存多久”:
proxy_cache_valid 200 201 301 302 5m; proxy_cache_valid 404 1m;
若想为 POST 响应单独设置策略(比如只缓存成功创建后的 201 响应 2 分钟):
proxy_cache_valid 201 2m;
3. 确保缓存 key 包含方法信息(可选但推荐)
默认 proxy_cache_key 不含 $request_method,会导致 GET /api 和 POST /api 共享同一个缓存 key,引发错误。建议显式加入:
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";
这样 GET /data 和 POST /data 就会命中不同缓存条目,互不干扰。
4. 验证响应是否真正被缓存
检查响应头中是否有:
-
X-Proxy-Cache: HIT(命中缓存) -
X-Proxy-Cache: MISS(未命中,已回源) -
Age:头非零(表示缓存已生效)
可在 location 中临时添加:
add_header X-Proxy-Cache $upstream_cache_status;
❌ 常见误区
- 以为设置了
proxy_cache_methods POST就自动缓存所有POST响应 → 实际还依赖proxy_cache_valid、Cache-Control、Vary头等。 - 忽略
proxy_cache_key中缺少$request_method→ 导致GET和POST响应互相覆盖。 - 对
POST缓存未加限制,导致敏感数据(如含用户 token 的响应)被意外缓存 → 应搭配proxy_no_cache过滤高风险请求(如带Authorization头或特定路径)。
✅ 实用示例:仅缓存幂等 POST /api/v2/export 响应
location = /api/v2/export {
proxy_pass https://origin;
proxy_cache edge_cache;
proxy_cache_methods GET HEAD POST;
proxy_cache_valid 200 201 10m;
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";
# 避免含认证头的请求进缓存
proxy_no_cache $http_authorization $http_cookie;
add_header X-Proxy-Cache $upstream_cache_status;
}
这样配置后,相同参数的 POST /api/v2/export 请求在 10 分钟内将直接返回缓存响应,显著降低源站压力。











