nginx 可以通过在 `location` 块中配置 `if` 指令判断 `$request_method`,并结合 `add_header cache-control no-store` 来强制客户端和中间代理不缓存 post/put 请求。具体做法是匹配对应方法后设置响应头,确保浏览器和 cdn 不会存储这些写操作的响应。

如何针对特定 HTTP 方法禁用缓存
当需要针对 POST 或 PUT 请求禁用缓存时,可以在 Nginx 配置中使用 `if ($request_method = POST)` 进行条件判断。在该条件块内添加 `add_header Cache-Control "no-store" always;`,这会向响应头注入禁止缓存的指令。这种方法简单直接,适用于大多数基于文件的静态或动态内容服务场景。

server {
listen 80;
server_name example.com;
location /api/ {
# 默认允许缓存
add_header Cache-Control "public, max-age=3600";
if ($request_method = POST) {
add_header Cache-Control "no-store" always;
}
proxy_pass http://backend;
}
}
上述配置中,对于 GET 请求,Nginx 会添加 `Cache-Control: public, max-age=3600`,允许缓存一小时。而对于 POST 请求,`if` 块生效,覆盖为 `no-store`。注意 `always` 参数确保即使错误响应(如 4xx/5xx)也携带该头部。实际测试中,使用 curl 发送 POST 请求并检查响应头,应能看到 `Cache-Control: no-store`。
如何处理 PUT 请求及复杂路由下的缓存策略
除了 POST,PUT 请求同样代表数据修改,通常也需要绕过缓存。如果 API 路由分散在不同 location,可以统一在 server 级别或通过 map 指令简化配置。例如,使用 `map` 将请求方法映射到缓存控制值,避免重复编写 if 语句。这种方式更易于维护,尤其当需要支持 DELETE、PATCH 等方法时。

map $request_method $cache_control {
default "public, max-age=3600";
POST "no-store";
PUT "no-store";
DELETE "no-store";
}
server {
listen 80;
server_name example.com;
location /api/ {
add_header Cache-Control $cache_control always;
proxy_pass http://backend;
}
}
此配置利用 `map` 指令根据 `$request_method` 变量动态设置 `$cache_control`。GET 请求走 default 分支,其他写操作统一指向 `no-store`。相比 if 块,map 方式性能更好且不易出错。验证时,可分别发送 GET、POST、PUT 请求,观察响应头中的 Cache-Control 值是否符合预期。若后端返回不同状态码,`always` 标志确保头部始终附加。
当后端返回 500 错误时缓存行为是否受影响
即使后端返回 500 内部服务器错误,只要配置了 `always` 参数,Nginx 仍会添加指定的 Cache-Control 头部。这意味着对于 POST/PUT 请求,即便出错,响应也不会被缓存。这是关键的安全特性,防止错误响应被误存导致后续请求获取陈旧或无效数据。开发者应确保所有敏感写操作都通过此类机制保护,避免因缓存污染引发业务逻辑错误。











