跳转至

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 指令定义的变量可以被 setauth_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 仓库 中找到此模块的其他配置提示和文档。