在 linux 中,nginx 可以通过配置 `proxy_cache_bypass` 指令,结合客户端发送的特定请求头(如 `cache-control: no-cache` 或自定义 header)来强制绕过缓存。具体做法是在 `http` 或 `server` 块中设置 `proxy_cache_bypass $http_cache_control;`,这样当请求头包含 `cache-control: no-cache` 时,nginx 将直接向源站请求最新内容而不使用本地缓存。

Nginx 如何识别并处理 Cache-Control 请求头
Nginx 默认会读取 HTTP 请求中的 `Cache-Control` 头部字段。如果该字段值为 `no-cache`,Nginx 会根据 `proxy_cache_bypass` 的配置决定是否跳过缓存查找。通过显式配置 `proxy_cache_bypass $http_cache_control;`,可以确保只要客户端发送此头部,请求就会直接转发给后端服务器,从而获取最新数据。

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_pass http://backend_server;
# 启用缓存
proxy_cache my_cache;
# 关键配置:当请求头包含 Cache-Control: no-cache 时,绕过缓存
proxy_cache_bypass $http_cache_control;
# 同时设置响应头,告知客户端不要缓存
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
}
如何通过自定义请求头实现更灵活的缓存绕过
除了标准的 `Cache-Control`,还可以使用自定义请求头(如 `X-Bypass-Cache`)来实现更细粒度的控制。例如,设置 `proxy_cache_bypass $http_x_bypass_cache;`,当请求头中包含 `X-Bypass-Cache: true` 时,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_pass http://backend_server;
proxy_cache my_cache;
# 使用自定义头 X-Bypass-Cache 绕过缓存
proxy_cache_bypass $http_x_bypass_cache;
# 可选:记录绕过缓存的请求日志
access_log /var/log/nginx/bypass_cache.log if=$http_x_bypass_cache;
}
}
验证缓存绕过是否生效的具体方法
要验证缓存绕过是否生效,可以使用 `curl` 命令发送带有不同请求头的请求,并观察响应时间和后端日志。例如,第一次请求正常走缓存,第二次添加 `Cache-Control: no-cache` 后,应观察到响应时间变长(因为需回源),且后端服务收到新请求。可通过检查 Nginx 的 `$upstream_cache_status` 变量确认状态为 `BYPASS`。


















