proxy_cache_valid按http状态码和作用域生效,非路径级;需通过嵌套location、独立keys_zone及proxy_cache_key实现路径级缓存差异,或用map动态设置缓存时间。

proxy_cache_valid 的缓存有效期设置,**不是按 URL 路径生效的,而是按 HTTP 状态码 + 作用域(http/server/location)组合生效的**。它本身没有“路径级”这一层控制能力,但可以通过嵌套 location 块、配合 proxy_cache_key 和多个缓存区(keys_zone),实现等效的路径级差异化缓存策略。
proxy_cache_valid 的真实作用范围
该指令只认状态码,不识别路径:
-
写法示例:
proxy_cache_valid 200 302 5m;表示所有返回 200 或 302 的响应,只要落在该指令生效的作用域内(比如某个 location),就统一缓存 5 分钟 - 它不会因为请求是
/api/user还是/static/logo.png就自动区别对待 - 即使两个请求都返回 200,只要配置在同一 location 下,就共用同一个 proxy_cache_valid 规则
实现路径级缓存差异的常用方法
要让不同路径走不同缓存周期,核心思路是:**把路径分到不同的 location 块中,并为每个块分配独立的缓存区和独立的 proxy_cache_valid 规则**。
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
-
按路径前缀拆分 location:
location /api/ { proxy_cache api_cache; proxy_cache_valid 200 60s; }location /static/ { proxy_cache static_cache; proxy_cache_valid 200 1d; } -
每个 location 使用专属 keys_zone:
在 http 块中提前定义:proxy_cache_path /var/cache/nginx/api levels=1:2 keys_zone=api_cache:20m inactive=10m;proxy_cache_path /var/cache/nginx/static levels=1:2 keys_zone=static_cache:50m inactive=7d; -
避免 key 冲突,可定制 proxy_cache_key:
比如在 /api/ 下加路径标识:proxy_cache_key "$uri?$args|api";
在 /static/ 下用更简 key:proxy_cache_key "$uri";
注意 proxy_cache_valid 对 404 等错误码的特殊处理
默认情况下,proxy_cache_valid 不缓存 404、500 等错误响应 —— 除非你显式声明:
- 直接写
proxy_cache_valid 404 10s;是无效的(Nginx 默认忽略) - 正确做法是配合
proxy_intercept_errors on;+error_page 404 = @handle_404;,把 404 转成内部 200 响应再缓存 - 此时
proxy_cache_valid 200 10s;才真正起效,且仅作用于该 @handle_404 location 内
进阶:用 map 实现动态缓存时间(非路径名,但更灵活)
如果路径规则复杂(如正则匹配、带参数判断),可用 map 指令生成变量,再用于 proxy_cache_valid:
- 先定义缓存时长映射:
map $request_uri $cache_ttl {<br> ~^/user/\d+/profile$ "30s";<br> ~^/product/\d+$ "5m";<br> default "1m";<br> } - 再在 location 中引用:
proxy_cache_valid 200 $cache_ttl; - ⚠️ 注意:此写法要求 Nginx ≥ 1.7.7,且 $cache_ttl 必须是合法时间字符串










