Nginx默认不缓存POST请求,需同时满足proxy_cache_methods含POST、响应含Cache-Control/Expires且状态码可缓存、未被no_cache/bypass排除三条件;配置时须在proxy_cache_key中加入$request_method以隔离GET/POST缓存。

默认情况下,Nginx 的 proxy_cache 仅对 GET 和 HEAD 请求启用缓存,POST、PUT、DELETE 等方法默认不参与缓存。这是因为这些方法通常带有副作用(如提交表单、修改数据),直接缓存可能引发一致性问题。但某些场景下——比如幂等的查询型 POST(如 GraphQL 查询、搜索接口)、或已确认无副作用的内部 API——确实需要开启 POST 缓存。
明确支持 POST 缓存的前提条件
必须同时满足以下三点,POST 请求才可能被缓存:
- 显式配置
proxy_cache_methods POST(或包含 POST 的列表) - 响应头中包含可缓存标识,例如
Cache-Control: public, max-age=60或Expires - 后端实际返回了可缓存的状态码(如 200、201),且未被
proxy_no_cache或proxy_cache_bypass规则排除
基础配置示例(启用 POST 缓存)
在 location 块中添加以下指令:
proxy_cache my_cache;
proxy_cache_valid 200 201 60s;
proxy_cache_methods GET HEAD POST;
proxy_cache_key "$scheme$request_method$host$uri$is_args$args";
注意:proxy_cache_key 中显式加入 $request_method,是为了避免 GET 与 POST 同 URL 时共用一个缓存条目(否则可能把 POST 响应错误地返回给 GET 请求)。
安全与幂等性控制建议
为降低风险,建议叠加以下限制:
- 仅对特定路径启用:如
location /api/search { ... },而非全局location / - 强制校验请求体哈希(需配合 Lua 或 OpenResty):用
$request_body_md5参与 key 构造,确保不同 body 缓存分离 - 禁用 Cookie/认证相关请求的缓存:
proxy_no_cache $http_cookie $http_authorization; - 设置较短缓存时间(如 10–60 秒),并配合
proxy_cache_use_stale updating提升可用性
验证是否生效
检查响应头中是否出现 X-Cache: HIT 或 X-Cache-Status: HIT(需提前配置 add_header X-Cache-Status $upstream_cache_status;)。同时用 curl -X POST -d '{"q":"test"}' -H "Content-Type: application/json" http://example.com/api/search 多次请求,观察后端 access log 是否只记录首次调用。











