Nginx 不支持直接缓存 PURGE 等自定义方法,需通过 GET 请求携带参数(如 _action=purge)映射语义,并用 proxy_cache_bypass 和 proxy_no_cache 控制缓存行为,配合 proxy_cache_key 多维区分与鉴权 purge,实现安全高效缓存管理。

Nginx 默认只缓存 GET 和 HEAD 请求,不缓存 POST、PUT、DELETE 等方法。若需对自定义请求方式(如 PURGE、BYPASS、CACHE-REFRESH)启用缓存加速,不能直接让这些方法参与缓存存储——因为 proxy_cache_methods 仅支持标准 HTTP 方法,且 Nginx 内部逻辑限制其值必须为 GET、HEAD、POST(仅限部分版本)、PURGE 不被原生支持。
但可通过“语义映射”实现等效效果:把自定义请求头或路径特征,映射为可缓存的 GET 行为,并配合 proxy_cache_bypass 和 proxy_no_cache 精准控制缓存生命周期。这才是真正可行的高性能静态加速方案。
proxy_cache_methods 的合法取值与边界
- 支持的方法仅限:
GET、HEAD、POST(需显式配置,且 POST 缓存有严格前提) -
POST缓存需同时满足:proxy_cache_methods POST;-
proxy_cache_key中必须包含请求体哈希(如$request_body),否则所有 POST 请求共用同一 key,极易脏缓存 - 后端必须幂等,且响应带明确
Cache-Control或Expires
-
PURGE、OPTIONS、CUSTOM-VERB等无法写入proxy_cache_methods,Nginx 启动时会报错或静默忽略
用 GET 语义承载自定义动作(推荐实践)
将“刷新缓存”“预热缓存”“降级访问”等操作,转为带特定参数的 GET 请求,例如:
-
GET /api/item/123?_action=purge -
GET /static/logo.png?_v=20260502 GET /feed.json?_bypass=1
然后在 location 中用变量提取意图,控制缓存行为:
location ~ \.json$ {
# 提取业务动作标识
set $cache_action "";
if ($args ~ "_action=([a-z]+)") {
set $cache_action $1;
}
if ($args ~ "_bypass=1") {
set $cache_action "bypass";
}
# 不缓存 purge / bypass 类请求
proxy_no_cache $cache_action;
proxy_cache_bypass $cache_action;
# 仅当 $cache_action 为空时才走缓存
proxy_cache my_cache;
proxy_cache_valid 200 5m;
}
✅ 这样既绕过
proxy_cache_methods的语法限制,又保持了请求语义清晰、CDN 兼容、浏览器可调试。
WebChat Voice Proxy下载⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
配合 proxy_cache_key 实现多维度命中
若需按用户角色、设备类型、灰度标签等区分缓存,应在 proxy_cache_key 中加入对应变量:
proxy_cache_key "$scheme$request_method$host$uri$is_args$args:$cookie_user_role:$http_x_device_type";
注意:$cookie_* 和 $http_* 变量需确保存在,否则 key 中出现空字符串会导致误共享;建议搭配 map 指令做兜底:
map $cookie_user_role $cache_role {
"" "guest";
default $cookie_user_role;
}
安全与清理机制不可省略
- 自定义动作(如 purge)必须鉴权,防止恶意刷空缓存:
location = /purge { allow 127.0.0.1; allow 10.0.0.0/8; deny all; proxy_cache_purge my_cache "$scheme$request_method$host$uri$is_args$args"; } - 使用
proxy_cache_purge模块(需编译时启用--add-module=ngx_cache_purge)才能真正删除缓存项。
不复杂但容易忽略











