最精准可控的方式是直接在location或server块中为不同状态码单独写proxy_cache_valid指令;需同时满足定义缓存区、启用缓存及响应可缓存三项前提,按语义分组设置时长,如200/206/304缓存1h、301缓存7d、302缓存2m、404缓存30s、5xx缓存10s、any兜底5s。

直接在 location 或 server 块里,为不同状态码或状态码组合单独写一行 proxy_cache_valid 指令,是最精准、最可控的方式。它不看后端返回的 Cache-Control,而是由 Nginx 主动控制缓存寿命。
按状态码语义分组设时间
不同状态码代表不同业务含义,缓存时长必须匹配其稳定性与敏感性:
-
proxy_cache_valid 200 206 304 1h;—— 正常响应、范围请求、协商成功,内容稳定,适合中长期缓存 -
proxy_cache_valid 301 7d;—— 永久重定向,语义承诺长期有效,可放心缓存一周 -
proxy_cache_valid 302 2m;—— 临时跳转,必须设极短时间,避免用户卡在旧路径 -
proxy_cache_valid 404 30s;—— “资源不存在”只防扫描,缓存过长会掩盖新上线路径 -
proxy_cache_valid 500 502 503 504 10s;—— 后端故障类错误,短时缓存缓解雪崩,但不宜超 1 分钟 -
proxy_cache_valid any 5s;—— 兜底未显式声明的状态码(如 403、429),不会覆盖已定义的规则
确保缓存真正生效的三个前提
只写 proxy_cache_valid 不起作用,以下三项必须同时满足:
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
- 在
http块中定义缓存区:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g; - 在对应
location中启用该缓存:proxy_cache my_cache; - 上游响应本身允许被缓存:默认不缓存含
Set-Cookie、Cache-Control: no-cache或private的响应;若需强制缓存,加proxy_ignore_headers Set-Cookie Cache-Control;
注意匹配顺序和作用域优先级
Nginx 从上到下逐行匹配,命中即停。所以:
- 更具体的规则建议写在前面,比如
301和302单独写,互不干扰 - 避免把
proxy_cache_valid any 1m;放最前,否则会截断所有后续精确规则 - 同一状态码出现多次时,后写的会覆盖前面的(例如先写
200 10m,再写200 30s,最终生效的是 30 秒) - 支持作用域覆盖:全局(
http块)设基础策略,特定location再细化,以最近配置为准
快速验证是否按预期工作
调试阶段加一行头,直观判断缓存行为:
- 在
location中添加:add_header X-Cache-Status $upstream_cache_status; - 用
curl -I http://host/path多次请求,观察响应头中X-Cache-Status是否从MIS变成HIT,以及响应时间是否明显下降 - 测试
301/302时优先用curl,避免浏览器本地强缓存干扰










