要真正实现动态跳过缓存,必须同时配置 proxy_cache_bypass 和 proxy_no_cache 并共用同一变量(如 $skip_cache),前者跳过缓存读取,后者阻止响应写入缓存;需用 map 指令将路径、请求头、cookie、参数等映射为布尔变量,并在 location 中统一启用双指令,任一变量为非空或非零即生效。

缓存绕过不是让扫描器或爬虫“自动绕过”,而是通过特定请求特征(如请求头、路径、参数)触发服务器跳过缓存,直接回源。安全扫描器和爬虫本身不自带缓存绕过逻辑,需你主动配置其请求行为,或在反向代理/CDN层做识别与路由控制。
在扫描器/爬虫端添加绕过缓存的请求头
多数现代缓存系统(如 Nginx、Varnish、Cloudflare)会响应标准缓存控制头。向目标发起请求时,显式携带以下任一头部,可大概率触发回源:
- Cache-Control: no-cache 或 Cache-Control: max-age=0
- Pragma: no-cache
- Expires: 0(或一个已过期的时间戳)
- Accept-Encoding: identity(避免压缩缓存歧义)
例如使用 curl 扫描单个 URL:
curl -H "Cache-Control: no-cache" -H "Pragma: no-cache" https://example.com/api/status用随机参数或时间戳干扰缓存键
很多缓存系统将查询参数纳入缓存键(key)。在 URL 后追加唯一、无业务意义的参数,可强制生成新缓存键,等效于绕过旧缓存:
- ?_t=1726514420(当前 Unix 时间戳)
- ?v=0.1.923(随机版本号)
- ?nocache=uuid(每次请求生成新 UUID)
注意:需确认后端未过滤或忽略这些参数,否则无效;部分 CDN(如 Cloudflare)默认忽略 _ 开头参数,可用 cb、ts 等更通用字段。
服务端识别并放行扫描器 IP 的回源策略
若你有反向代理(如 Nginx)或 CDN 控制权,可在服务端做 IP+User-Agent 双重识别,对可信扫描器 IP 直接跳过缓存:
- Nginx 示例:在 location 块中加入
if ($remote_addr ~ "(192\.168\.10\.5|203\.0\.113\.12)") { set $skip_cache 1; }
if ($http_user_agent ~* "Nuclei|Nessus|Acunetix|ZAP") { set $skip_cache 1; }
proxy_cache_bypass $skip_cache;
proxy_no_cache $skip_cache;
该方式更可靠,且不依赖客户端配合,但要求你明确管理扫描器出口 IP 段,并定期更新 User-Agent 白名单。
验证是否真正绕过缓存
仅看响应码或内容不够,需检查响应头与行为一致性:
- 查看响应头中是否有 X-Cache: MISS、X-Cache-Hits: 0、Age: 0
- 对比两次相同请求的 ETag 或 Last-Modified 是否变化(动态内容应不同)
- 用
curl -I多次请求,观察 Age 值是否始终为 0
若 Age > 0 或 X-Cache: HIT,则仍命中缓存,需回溯检查哪一环未生效(是扫描器没发对头?CDN 忽略了头?还是缓存规则优先级更高?)











