Nginx中排除特定路由缓存需用map指令映射路径为布尔变量,再由proxy_cache_bypass(跳过读缓存)和proxy_no_cache(阻止写缓存)共同作用;必须在location块内配合使用,且推荐显式设置proxy_cache_key以避免参数混淆。

Nginx 中 proxy_cache_bypass 本身不用于排除特定路由的缓存,它只控制“当前请求是否跳过缓存查找”,而不是按路由路径主动剔除或禁用缓存策略。真正实现“排除特定路由缓存”的核心方式,是结合 map 指令生成布尔变量,再由 proxy_cache_bypass 和 proxy_no_cache 共同驱动——前者跳过读缓存,后者阻止写缓存,从而让目标路由彻底绕过整个缓存生命周期。
路由路径判断必须用 $request_uri 或 $uri
Nginx 不允许在 proxy_cache_bypass 中直接写正则或路径字面量(如 proxy_cache_bypass /admin/ 是语法错误)。正确做法是:
用 map 将请求路径映射为一个变量(如 $skip_cache_by_path),再把这个变量传给 proxy_cache_bypass:
map $request_uri $skip_cache_by_path {
~*^/admin/ 1;
~*^/api/debug 1;
~*^/healthz 1;
default 0;
}-
~*表示忽略大小写的正则匹配 -
$request_uri包含完整请求路径+查询参数(如/admin/users?format=json) - 若只需匹配路径不含参数,可用
$uri(如/admin/)
必须和 proxy_cache 在同一 location 中启用
单独写 map 或只在 http 块里配 proxy_cache_bypass 无效。以下是最小可行配置片段:
location / {
proxy_pass http://backend;
# 缓存基础配置(必需)
proxy_cache mycache;
proxy_cache_valid 200 302 5m;
# 绕过读 + 阻止写(双保险)
proxy_cache_bypass $skip_cache_by_path;
proxy_no_cache $skip_cache_by_path;
}-
mycache必须与proxy_cache_path中定义的keys_zone名称一致 - 两个指令共用同一变量,值为
1(或任意非空非"0"/"off"字符串)时即触发
排除路由时建议搭配 proxy_cache_key 避免误命中
某些路由虽被 bypass,但若 proxy_cache_key 设计不合理(比如没包含 $is_args$args),可能导致不同参数的请求共享同一缓存 key。推荐显式定义:
proxy_cache_key "$host$uri$is_args$args";
这样 /api/data?id=1 和 /api/data?id=2 不会互相覆盖,即使都走缓存也互不干扰;而 bypass 规则仍能精准作用于 /admin/ 类路径。
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
多条件组合更灵活(可选)
如果还需叠加角色、Header 或 IP 控制,可定义多个 map,然后一起传入:
map $http_x_user_role $skip_cache_by_role {
"admin" 1;
"dev" 1;
default 0;
}
# 在 location 中
proxy_cache_bypass $skip_cache_by_path $skip_cache_by_role;
proxy_no_cache $skip_cache_by_path $skip_cache_by_role;只要任一变量为真,整条指令就生效——语义是“满足任一条件即绕过”。
不复杂但容易忽略


















