nginx变量必须用set指令在server、location或if块中显式定义,以$开头,仅在所在作用域及嵌套块生效;值恒为字符串,未定义引用返回空字符串;内置变量可直接读用,自定义变量不可用于log_format。

在 Nginx 中,变量不能像编程语言那样“全局声明”后直接使用,而是必须在具体作用域内通过 set 指令显式定义,且仅在其所在的配置块及其嵌套块中有效。变量值始终是字符串,不支持类型转换或复合数据结构。
变量必须用 set 指令定义
Nginx 不提供独立的变量声明语法,所有变量都需通过 set 指令赋值,且只能出现在 server、location 或 if 块中(不能放在 http 全局块顶层)。
-
set $my_var "value";是唯一合法的定义方式,变量名必须以$开头 - 未定义就引用(如
echo $undefined;)会导致空字符串,不会报错但可能引发逻辑错误 - 同一变量可在不同 location 中重复 set,互不影响——作用域隔离
变量在 server 块中的典型使用场景
变量常用于动态构造响应内容、路径重写、条件判断或日志记录,关键在于明确其生效范围。
- 在
server块开头set的变量,对该 server 内所有 location 可见(除非被同名变量覆盖) - 可结合
echo(需 ngx_echo 模块)、return、proxy_pass或rewrite使用,例如:set $backend_url "https://api.example.com";<br>proxy_pass $backend_url$request_uri;
- 变量插值支持嵌套拼接:
set $host_port "$host:$server_port";,但注意 $host 是内置变量,非自定义
内置变量与自定义变量的区别
内置变量(如 $remote_addr、$request_uri)无需定义,随时可读;自定义变量必须先 set 才能使用,且不可修改内置变量。
- 内置变量多数只读,少数可写(如
$args在 rewrite 中可被修改) - 自定义变量不能用于
log_format中——日志格式只接受内置变量和部分模块变量 - 变量插值仅在支持该特性的指令中生效(如
echo、return、proxy_pass),不是所有指令都支持
常见陷阱与验证建议
变量行为容易因作用域或执行时机出错,调试时需格外留意。
-
if块中 set 的变量,在 if 外不可见;且 if 的执行顺序受 Nginx 配置解析机制影响,不宜依赖复杂逻辑 - 修改配置后务必运行
nginx -t检查语法,变量拼写错误(如漏写$)会导致配置加载失败 - 可通过
echo指令快速验证变量值:location /debug { echo "var: $my_var"; }











