nginx默认不缓存post等非安全方法,仅当post接口满足语义只读、严格幂等、无用户上下文三条件时才可谨慎启用;需同步配置cache_key、ignore_headers、cache_valid和cache_lock,并主动排除/login等高风险路径。

默认只缓存 GET 和 HEAD 请求,这是最稳妥的起点。POST、PUT 等方法不参与缓存,不是 Nginx 的疏忽,而是基于 HTTP 语义和安全实践的主动限制——绝大多数 POST 操作涉及状态变更(如登录、下单、表单提交),缓存其响应极易引发数据错乱或重复执行。
哪些 POST 请求值得考虑缓存
仅当满足全部三个条件时,才可谨慎启用 POST 缓存:
- 语义只读:接口行为不修改服务端状态,例如 JSON 搜索 API、配置拉取接口、批量元数据查询;
- 严格幂等:相同参数的多次请求,返回完全一致的响应,且无时间敏感字段(如当前时间戳、随机 token);
- 无用户上下文:响应内容不依赖 session、cookie 或个性化权限,所有用户看到的结果相同。
必须同步配置的四项关键指令
单独加 fastcgi_cache_methods GET HEAD POST 不起作用。需在启用缓存的 location 块中一并设置:
-
fastcgi_cache_key "$scheme$request_method$host$request_uri$is_args$args"—— 推荐将参数转为 query string,避免直接用$request_body; -
fastcgi_ignore_headers Cache-Control Expires Set-Cookie—— 防止后端返回的禁用头跳过缓存; -
fastcgi_cache_valid 200 302 5m—— 明确声明 POST 成功响应的有效期; -
fastcgi_cache_lock off或合理设置fastcgi_cache_lock_timeout—— 避免并发请求因锁机制全部穿透到后端。
主动排除不安全路径
即使全局启用了 POST 缓存,也应通过 map 或条件判断屏蔽高风险路径:
- 用
map $request_uri $no_cache匹配/login、/api/order、/admin/等路径,设为 1; - 在
location ~ \.php$中加入fastcgi_no_cache $no_cache;; - 搭配
fastcgi_cache_bypass $arg_nocache $cookie_nocache,便于开发调试时手动绕过。
缓存访问频率的提升,不靠盲目扩大方法范围,而靠精准识别可缓存的只读行为,并用键设计、头处理、路径过滤三者协同守住边界。











