nginx默认仅缓存get和head请求,因其幂等无副作用;post等方法需显式配置proxy_cache_methods才可能缓存,且须配合proxy_cache、proxy_cache_path和proxy_cache_valid方可生效。

Nginx 缓存层默认只对 GET 和 HEAD 请求执行缓存,这是由协议语义和安全性共同决定的——这两类方法是幂等、无副作用的,适合缓存;而 POST、PUT、DELETE 等方法可能改变服务端状态,Nginx 默认不缓存它们,除非显式配置。
缓存请求方法的底层逻辑
Nginx 在收到客户端请求后,会先检查请求方法是否在 proxy_cache_methods 指令允许的范围内。
- 若未配置该指令,Nginx 默认等价于
proxy_cache_methods GET HEAD; - 若配置为
proxy_cache_methods GET HEAD POST;,则也会尝试缓存POST响应(但需注意:后端必须返回可缓存的响应头,如Cache-Control: public,否则仍不会缓存) - 方法校验发生在缓存查找前,不匹配的方法直接跳过缓存流程,直接转发给上游
如何控制哪些方法参与缓存
你可以在 http、server 或 location 块中设置,优先级按作用域从细到粗生效:
- 使用标准配置(推荐):
proxy_cache_methods GET HEAD;
- 允许额外方法(谨慎使用):
proxy_cache_methods GET HEAD POST;
- 禁用 HEAD(极少需要):
proxy_cache_methods GET;
注意:仅配置 proxy_cache_methods 不足以启用缓存,它必须与以下三项协同工作:
-
proxy_cache_path—— 定义缓存存储路径与内存元数据区 -
proxy_cache—— 指定启用哪个缓存区 -
proxy_cache_valid—— 明确哪些状态码及对应缓存时长
实际生效的关键细节
-
HEAD请求虽不返回响应体,但 Nginx 仍会缓存其响应头(如Content-Length、Last-Modified),并用于后续GET请求的缓存键比对 - 缓存键(
proxy_cache_key)默认包含$request_method,因此GET /a和HEAD /a会被视为两个独立缓存项,互不影响 - 即使
HEAD请求被缓存,也不会替代GET的缓存内容;二者共存,各自独立过期与清理
常见误操作提醒
- ❌ 仅写
proxy_cache_methods GET HEAD;却没配proxy_cache→ 缓存完全不生效 - ❌ 把
proxy_cache_methods放在upstream块里 → 语法错误,该指令不支持该上下文 - ❌ 忽略
proxy_cache_valid→ 即使方法匹配,若响应码不在有效列表中(如默认只认200、301、302),依然不缓存
不复杂但容易忽略











