在 nginx 中配置不写入缓存,核心是结合 proxy_cache 和 proxy_no_cache 指令。通过设置 proxy_no_cache 的条件(如 cookie、header 或变量),nginx 会直接转发请求并返回响应,同时跳过缓存文件的写入过程。

如何根据 Cookie 判断是否跳过缓存?
当需要针对特定用户(如登录状态)禁用缓存时,可以通过检查请求中的 Cookie 来实现。如果请求头中包含特定的 Cookie 值,Nginx 将不会从缓存中读取,也不会将响应存入缓存。

server {
listen 80;
server_name example.com;
# 定义缓存路径和参数
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
location /api/ {
# 启用缓存
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 关键配置:如果 Cookie 中包含 'nocache',则不缓存
proxy_no_cache $cookie_nocache $arg_nocache;
# 其他代理设置
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
在上述配置中,proxy_cache_path 定义了缓存存储的位置和基本参数。proxy_cache 启用了名为 my_cache 的缓存区域。proxy_no_cache 指令接收两个变量:$cookie_nocache 和 $arg_nocache。如果这两个变量的值为非空且非 "0",Nginx 就不会写入缓存。例如,当客户端发送带有 Cookie: nocache=1 的请求时,$cookie_nocache 的值将为 "1",从而触发不缓存逻辑。
如何根据 Header 或环境变量动态控制缓存?
除了 Cookie,还可以利用请求头(如 X-No-Cache)或自定义变量来控制缓存行为。这种方式常用于调试或特定 API 场景,允许调用方显式要求实时数据。

server {
listen 80;
server_name example.com;
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
location /dynamic/ {
proxy_cache my_cache;
proxy_cache_valid 200 5m;
# 检查自定义 Header
set $no_cache 0;
if ($http_x_no_cache = "true") {
set $no_cache 1;
}
# 基于变量决定是否不缓存
proxy_no_cache $no_cache;
proxy_cache_bypass $no_cache;
proxy_pass http://backend_server;
proxy_set_header Host $host;
}
}
此配置使用了 if 语句来检查 $http_x_no_cache 头部。如果其值为 "true",则将内部变量 $no_cache 设置为 "1"。proxy_no_cache 使用这个变量来决定是否跳过缓存写入。同时,proxy_cache_bypass 也被设置为相同变量,确保即使有旧缓存存在,也会向源服务器重新获取最新内容。这种组合确保了完全绕过缓存机制。
当 proxy_no_cache 条件满足时,实际返回结果是什么?
当 proxy_no_cache 的条件被满足时,Nginx 的行为是直接向后端服务器发起请求,获取最新响应,并将其直接发送给客户端。整个过程不会在磁盘上创建任何缓存文件,也不会更新缓存索引。这意味着后续的相同请求如果没有新的触发条件,仍可能命中缓存(如果之前有缓存的话),除非同时配置了 proxy_cache_bypass 来强制刷新。
,











