最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何配置 Nginx 缓存来识别不同的请求参数
时间:2026-06-20 09:54:04 编辑:袖梨 来源:一聚教程网
Nginx 缓存是否区分查询参数取决于 proxy_cache_key 是否包含 $args 或结构化参数,推荐用 "$scheme$host$request_uri$is_args$args" 并排除敏感参数;需用 proxy_cache_bypass 绕过个性化请求,再通过 map 按参数语义设置差异化缓存时间。
Nginx 默认不区分带不同查询参数的请求,比如 /api/user?id=123 和 /api/user?id=456 若未显式配置缓存键,会被当成同一个 URL 缓存,导致数据错乱。要让缓存真正“识别参数”,关键不是“检测”参数,而是在缓存键(proxy_cache_key)中显式包含参数,并配合绕过逻辑控制缓存行为。
必须把 $args 或结构化参数纳入缓存键
Nginx 缓存是否区分请求,完全取决于 proxy_cache_key 的构成。若 key 中不含参数,所有参数变体都会命中同一缓存项。
-
✅ 推荐写法(含标准化参数顺序):
proxy_cache_key "$scheme$host$request_uri$is_args$args";
request_uri已包含原始路径和查询串,$is_args$args确保空参数时不会多出?,语义清晰且兼容性好。 ⚠️ 避免直接用
$request_uri单独作为 key:
它不区分大小写,且对参数顺序、编码格式不敏感(如a=1&b=2和b=2&a=1可能被视作相同),易引发冲突。-
? 对敏感参数(如
token、session_id)需排除在 key 外:set $cache_args "";if ($args ~ "^(.*&)?(token|sid)=[^&]*(?:&.*)?$") { set $cache_args $1$3;}proxy_cache_key "$scheme$host$request_uri$is_args$cache_args";更稳妥的做法是用
map预处理(避免if在 location 外的风险),或由后端统一签名后透传(如X-Req-Sign)。
按参数动态决定是否跳过缓存
有些参数天然表示个性化或临时状态,这类请求不应进缓存,应通过 proxy_cache_bypass 实时拦截:
-
用户身份类参数直接绕过:
proxy_cache_bypass $arg_user_id $arg_session $cookie_auth_token;
只要任一变量非空,就跳过缓存,直连后端。
-
统一管理登录态接口:
location /user/ { proxy_cache_bypass $arg_token $cookie_jwt; proxy_cache_valid 200 2m;}
区分参数语义,实现差异化缓存时间
单纯“识别参数”不够,还要按参数含义做策略分级。例如:
- 公共资源(
/product?id=1001)可缓 1 小时; - 个人资源(
/order?user_id=123)禁止缓存。
用 map 提前打标,再结合 proxy_cache_valid:
map $args $cache_policy { "~*id=d+" "public_1h"; "~*user_id=" "private_0s"; default "default_5m";}location /api/ { proxy_cache_valid 200 $cache_policy;}
注意:proxy_cache_valid 支持变量,但只接受时间值(如 "1h"、"0s"),不能是字符串或布尔。
不复杂但容易忽略
相关文章
- 明末渊虚之羽版本奖励错误如何补偿 07-01
- 原神峡谷盈月之镜解谜方法 07-01
- 末日进化如何升级人物卡 07-01
- 魔兽世界卡格罗什的命运背包位置在哪 07-01
- 沙石镇时光体力恢复方法大全 沙石镇时光快速回满体力的实用技巧 07-01
- 空洞骑士寻神者篇章攻略 07-01