Nginx 不支持直接缓存 PURGE 等自定义方法,需通过 GET 请求携带参数(如 _action=purge)映射语义,并用 proxy_cache_bypass 和 proxy_no_cache 控制缓存行为,配合 proxy_cache_key 多维区分与鉴权 purge,实现安全高效缓存管理。
Nginx 默认只缓存
和
请求,不缓存
、
、
等方法。若需对自定义请求方式(如
、
、
)启用缓存加速,
不能直接让这些方法参与缓存存储
——因为
仅支持标准 HTTP 方法,且 Nginx 内部逻辑限制其值必须为
、
、
(仅限部分版本)、
不被原生支持。
但可通过“语义映射”实现等效效果:把自定义请求头或路径特征,映射为可缓存的
行为,并配合
和
精准控制缓存生命周期。这才是真正可行的高性能静态加速方案。
proxy
_cache_methods 的合法取值与边界
支持的方法仅限:
、
、
(需显式配置,且 POST 缓存有严格前提)
缓存需同时满足:
中必须包含请求体哈希(如
),否则所有 POST 请求共用同一 key,极易脏缓存
后端必须幂等,且响应带明确
或
、
、
等
无法写入
,Nginx 启动时会报错或静默忽略
用 GET 语义承载自定义动作(推荐实践)
将“刷新缓存”“预热缓存”“降级访问”等操作,转为带特定参数的
请求,例如:
然后在 location 中用变量提取意图,控制缓存行为:
✅ 这样既绕过
的语法限制,又保持了请求语义清晰、CDN 兼容、浏览器可调试。
配合 proxy_cache_key 实现多维度命中
若需按用户角色、设备类型、灰度标签等区分缓存,应在
中加入对应变量:
注意:
和
变量需确保存在,否则 key 中出现空字符串会导致误共享;建议搭配
指令做兜底:
安全与清理机制不可省略
自定义动作(如 purge)必须鉴权,防止恶意刷空缓存:
使用
模块(需编译时启用
)才能真正删除缓存项。
不复杂但容易忽略
GETHEADPOSTPUTDELETEPURGEBYPASSCACHE-REFRESHproxy_cache_methodsGETHEADPOSTPURGEGETproxy_cache_bypassproxy_no_cacheGETHEADPOSTPOSTproxy_cache_methods POST;proxy_cache_key$request_bodyCache-ControlExpiresPURGEOPTIONSCUSTOM-VERBproxy_cache_methodsGETGET /api/item/123?_action=purgeGET /static/logo.png?_v=20260502GET /feed.json?_bypass=1location ~ \.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_methodsproxy_cache_keyproxy_cache_key "$scheme$request_method$host$uri$is_args$args:$cookie_user_role:$http_x_device_type";$cookie_*$http_*mapmap $cookie_user_role $cache_role {
"" "guest";
default $cookie_user_role;
}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