var: 通过预定义函数进行动态变量赋值
安装
您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:
- RedHat Enterprise Linux 7、8、9 和 10
- CentOS 7、8、9
- AlmaLinux 8、9
- Rocky Linux 8、9
- Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-var
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-var
通过在 /etc/nginx/nginx.conf 的顶部添加以下内容来启用该模块:
load_module modules/ngx_http_var_module.so;
本文档描述了 nginx-module-var v0.1.0,于 2026 年 1 月 6 日发布。
server {
listen 127.0.0.1:8080;
server_name localhost;
location / {
var $copy_var copy $scheme://$host$request_uri;
}
}
指令
var
语法: var $new_variable operator [-i] args... [if\=condition]
默认值: -
上下文: http, server, location
定义一个变量,其值是函数计算的结果。变量值不能被缓存,每次使用时都会重新计算。如果当前级别没有使用此指令定义同名变量,则可以从上一级继承。-i 参数用于忽略大小写。
以下函数可用:
#### 条件判断 ####
## 如果输入参数为空或为 0,则返回 1,否则返回 0
var $bool_var not str;
## 如果所有输入参数都非空且不为 0,则返回 1,否则返回 0
var $bool_var and str1 str2...;
## 如果任何输入参数非空且不为 0,则返回 1,否则返回 0
var $bool_var or str1 str2...;
#### 字符串判断 ####
## 检查字符串是否为空,返回 1 或 0
var $bool_var if_empty str;
## 检查字符串是否非空,返回 1 或 0
var $bool_var if_not_empty str;
## 检查字符串是否为数字,返回 1 或 0
var $bool_var if_is_num str;
## 检查字符串是否相等,返回 1 或 0
var $bool_var if_str_eq [-i] str1 str2;
## 检查字符串是否不相等,返回 1 或 0
var $bool_var if_str_ne [-i] str1 str2;
## 检查字符串是否具有指定前缀,返回 1 或 0
var $bool_var if_starts_with [-i] str prefix;
## 检查字符串是否具有指定后缀,返回 1 或 0
var $bool_var if_ends_with [-i] str suffix;
## 检查子字符串是否存在,返回 1 或 0
var $bool_var if_find [-i] str sub_str;
## 检查 str1 是否为 str2 .. strn 中的一个,返回 1 或 0
var $bool_var if_str_in [-i] str1 str2 str3 .. strn;
#### 一般字符串操作 ####
## 复制变量的值
var $new_var copy src_str;
## 字符串的长度
var $new_var len src_str;
## 转换为大写
var $new_var upper src_str;
## 转换为小写
var $new_var lower src_str;
## 修剪前导和尾随空白字符
var $new_var trim src_str;
## 修剪前导空白字符
var $new_var ltrim src_str;
## 修剪尾随空白字符
var $new_var rtrim src_str;
## 反转字符串
var $new_var reverse src_str;
## 获取子字符串的起始位置
var $new_var find [-i] src_str sub_str;
## 重复字符串指定次数
var $new_var repeat src_str times;
## 提取子字符串
var $new_var substr src_str start [len];
## 替换关键字
var $new_var replace [-i] src_str src dst;
#### 正则判断 ####
## 检查正则表达式是否匹配,返回 1 或 0
var $bool_var if_re_match [-i] src_str match_regex;
#### 正则操作 ####
## 捕获正则表达式
var $new_var re_capture [-i] src_str capture_regex assign_value;
## 替换正则表达式
var $new_var re_sub [-i] src_str capture_regex assign_value;
## 全局正则替换
var $new_var re_gsub [-i] src_str capture_regex assign_value;
#### 数学判断 ####
## 检查数字是否相等,返回 1 或 0
var $bool_var if_eq num1 num2;
## 检查数字是否不相等,返回 1 或 0
var $bool_var if_ne num1 num2;
## 检查是否小于,返回 1 或 0
var $bool_var if_lt num1 num2;
## 检查是否小于或等于,返回 1 或 0
var $bool_var if_le num1 num2;
## 检查是否大于,返回 1 或 0
var $bool_var if_gt num1 num2;
## 检查是否大于或等于,返回 1 或 0
var $bool_var if_ge num1 num2;
## 检查是否在 start_num-end_num 范围内,返回 1 或 0
var $bool_var if_range num start_num-end_num;
## 检查数字是否为 num2 .. numn 中的一个,返回 1 或 0
var $bool_var if_in num1 num2 .. numn;
### 数学操作 ####
## 绝对值(返回原始格式,不带负号)
var $new_var abs num;
## 最大值(返回原始格式)
var $new_var max num1 num2;
## 最小值(返回原始格式)
var $new_var min num1 num2;
## 整数加法
var $new_var add int1 int2;
## 整数减法
var $new_var sub int1 int2;
## 整数乘法
var $new_var mul int1 int2;
## 整数除法,int2 不能为 0
var $new_var div int1 int2;
## 整数取模,int2 不能为 0
var $new_var mod int1 int2;
## 四舍五入到 n 位有效数字
var $new_var round src_num int;
## 向下取整,返回小于或等于源的最大整数
var $new_var floor src_num;
## 向上取整,返回大于或等于源的最小整数
var $new_var ceil src_num;
## 随机大正整数
var $new_var rand;
## 指定范围内的随机正整数
var $new_var rand_range start_int-end_int;
#### 编码和解码 ####
## 将二进制转换为十六进制
var $new_var hex_encode src_str;
## 将十六进制转换为二进制
var $new_var hex_decode src_str;
## 十进制转十六进制
var $new_var dec_to_hex dec;
## 十六进制转十进制
var $new_var hex_to_dec hex;
## 完整 URI 编码
var $new_var escape_uri src_str;
## 参数编码
var $new_var escape_args src_str;
## URI 组件编码
var $new_var escape_uri_component src_str;
## HTML 编码
var $new_var escape_html src_str;
## URI 解码
var $new_var unescape_uri src_str;
## Base64 编码
var $new_var base64_encode src_str;
## Base64url 编码
var $new_var base64url_encode src_str;
## Base64 解码
var $new_var base64_decode src_str;
## Base64url 解码
var $new_var base64url_decode src_str;
#### 加密哈希计算 ####
## CRC32 编码(用于短字符串)
var $new_var crc32_short src_str;
## CRC32 编码(用于长字符串)
var $new_var crc32_long src_str;
## MD5 编码
var $new_var md5sum src_str;
## SHA1 编码
var $new_var sha1sum src_str;
## SHA256 编码
var $new_var sha256sum src_str;
## SHA384 编码
var $new_var sha384sum src_str;
## SHA512 编码
var $new_var sha512sum src_str;
## HMAC_SHA1 加密
var $new_var hmac_sha1 src_str secret;
## HMAC_SHA256 加密
var $new_var hmac_sha256 src_str secret;
#### 时间范围判断 ####
## 确定当前时间是否满足给定的时间范围,至少需要一个参数。
## 如果所有条件都满足,则返回 1,否则返回 0。
## 一周的天数用 1-7 表示,其中星期日为 7,时区格式为 gmt+0800
var $bool_var if_time_range [year=year_range] [month=month_range] [day=day_range] [wday=wday_range(1-7)] [hour=hour_range] [min=min_range] [sec=sec_range] [timezone];
#### 时间格式 ####
## 将时间戳转换为指定格式的 GMT 时间(如果省略时间戳则为当前时间)
var $new_var gmt_time [src_ts] date_format;
## 将时间戳转换为 HTTP 时间(如果省略时间戳则为当前时间)
var $new_var gmt_time [src_ts] http_time;
## 将时间戳转换为 cookie 时间(如果省略时间戳则为当前时间)
var $new_var gmt_time [src_ts] cookie_time;
## 将时间戳转换为指定格式的本地时间(如果省略时间戳则为当前时间)
var $new_var local_time [src_ts] date_format;
## 返回当前时间戳
var $new_var unixtime;
## 将 HTTP 时间转换为时间戳
var $new_var unixtime src_http_time http_time;
## 将指定日期转换为时间戳(如果全部省略则返回当前时间戳)
var $new_var unixtime src_time date_format timezone;
#### IP 范围判断 ####
## 确定 IP 地址是否在 IP 范围内,如果是,则返回 1,否则返回 0
var $bool_var if_ip_range ip_str ip_range_str1 ip_range_str2...;
#### HTTP 信息 ####
## 获取指定请求参数的值,arg_name 可以包含 '-',并且不区分大小写。
var $new_var get_arg argname;
## 获取指定请求 cookie 名称的值,cookie_name 可以包含 '-' 或 '.',并且不区分大小写。
var $new_var get_cookie cookie_name;
## 获取指定上游 Set-Cookie 名称的值,cookie_name 可以包含 '-' 或 '.',并且不区分大小写。
var $new_var get_upstream_cookie cookie_name;
除正则表达式外,所有参数都可以包含变量。然而,不正确的参数值将导致函数计算结果为空。
使用 var 指令定义的变量可以被 set 和 auth_request_set 等指令覆盖。
if 参数启用条件 var。如果条件评估为“0”或空字符串,则 var 不会被赋值。它将继续查找该变量的后续定义。
## 当请求头 A 存在时,变量的值为 'have-header-a'
var $new_var copy have-header-a if=$http_a;
## 当请求头 A 不存在但请求头 B 存在时,变量的值为 'have-header-b'
var $new_var copy have-header-b if=$http_b;
## 当请求头 A 和 B 都不存在时,变量的值为 'not-have-a-or-b'
var $new_var copy not-have-a-or-b;
GitHub
您可以在 nginx-module-var 的 GitHub 仓库 中找到此模块的其他配置提示和文档。