Nginx中server块变量(如$server_name、$host)在连接建立后即可获取,用于虚拟主机选择;location块变量(如$uri、$request_uri)在匹配后才确定,受rewrite影响;部分变量(如$host、$scheme)两者共用但语义可能因阶段不同而变化。

在 Nginx 配置中,server 块和location 块各自可访问的变量范围略有不同,但大部分内置变量是全局可用的。关键区别不在于“哪些变量只能在 server 里用”或“哪些仅限 location”,而在于变量的值是否已在此阶段完全确定——比如 $host、$args、$request_uri 等,在 server 阶段已解析完毕,但在 location 内使用时,其语义可能因重写(rewrite)而改变。
server 块常用变量(含作用说明)
这些变量在 TCP 连接建立、Host 头解析、SSL SNI 识别后即可获取,适用于虚拟主机选择、日志记录、条件判断等:
-
$server_name:当前匹配的 server 块中定义的域名(如www.example.com),多个值时取第一个匹配项 -
$server_addr:Nginx 实际监听的服务器 IP 地址(非客户端看到的 VIP) -
$server_port:当前连接使用的监听端口(如 80 或 443) -
$scheme:请求协议,值为http或https(由 listen 指令 + SSL 配置决定) -
$host:来自请求头 Host 字段的原始值(若缺失,则 fallback 为$server_name或 IP) -
$http_host:严格等于请求头中的 Host 字段(含端口,如example.com:8080) -
$server_protocol:客户端使用的协议版本,如HTTP/1.1或HTTP/2
location 块常用变量(侧重 URI 处理上下文)
这些变量在 location 匹配完成后才具备明确语义,尤其受 rewrite 影响显著,常用于路径改写、代理转发、静态资源定位:
-
$uri:当前匹配的 URI(未解码,不带参数,如/api/v1/users),会受 rewrite 改变 -
$request_uri:原始请求的完整 URI(含 query string,如/api/v1/users?id=123),不会被 rewrite 修改 -
$args:查询字符串部分(即?id=123&name=test中的id=123&name=test) -
$document_root:当前 location 生效的根目录路径(由 root / alias 指令决定) -
$request_filename:映射后的物理文件绝对路径(如/var/www/html/api/v1/users),依赖$document_root和$uri -
$realpath_root:经过符号链接解析后的实际根路径(需启用disable_symlinks或配合 use_fastcgi)
两者共用但行为易混淆的关键变量
以下变量在 server 和 location 中都可调用,但实际值可能因执行阶段不同而变化:
-
$host:server 中反映 Host 头原始输入;location 中若前面有 rewrite,仍保持原值(不变) -
$http_user_agent、$http_cookie:始终取自原始请求头,不受 rewrite 影响 -
$arg_xxx(如$arg_id):直接提取 query string 中指定参数,location 中更常用于路由分发或透传 -
$scheme和$server_port:server 阶段已固定,location 中只是复用,不可修改
变量使用注意事项
实际配置中容易踩坑的地方:
- 在 location 内用
$uri做 proxy_pass 路径拼接时,注意它已被重写过;想用原始路径请用$request_uri -
root和alias对$uri的处理逻辑不同:root是拼接,alias是替换,影响$request_filename结果 - if 指令内慎用
$uri或$args,因为 if 执行时机晚于 location 匹配,且存在隐式重写风险 - 所有以
$http_开头的变量,名称小写转换为下划线(如User-Agent → $http_user_agent)


















