分清这些变量:Nginx 中几个易混的 $host与 $port
|
admin
2026年4月10日 9:44
本文热度 74
|
$http_host变量
获取原始Host请求头数值,可能为空
server {
listen 8080;
server_name test.example.com;
location /test-host {
default_type text/plain;
return 200 "http_host variable: $http_host \n";
}
}
[root@bogon vhosts]# curl -x http://localhost:8080 http://api.example.com/test-host
http_host variable: api.example.com
[root@bogon vhosts]# curl -H "HOST: test1.com" http://localhost:8080/test-host
http_host variable: test1.com
[root@bogon vhosts]# curl -H "HOST: test1.com:8080" http://localhost:8080/test-host
http_host variable: test1.com:8080
[root@bogon vhosts]# curl -0 -H "HOST: " http://localhost:8080/test-host
http_host variable:
proxy_host变量
proxy_pass指令中指定的代理服务器名称和端口
$proxy_port变量
proxy_pass指令中指定的后端服务器地址所包含的端口或所用协议的默认端口, 数值来源如下
情况一: proxy_pass指定了端口号
proxy_pass http://192.168.1.100:8080;
# $proxy_port 的值是 `8080`
情况二: 使用协议的默认端口
当在 proxy_pass指令中只写了主机名或IP,没有写端口号时,Nginx 会使用该 URL 协议对应的标准默认端口。
proxy_pass http://backend-server;
# 协议是 `http://`,其默认端口是 `80`
# $proxy_port 的值是 `80`
proxy_pass https://secure-backend;
# 协议是 `https://`,其默认端口是 `443`
# $proxy_port 的值是 `443`
特殊情况
当 proxy_pass指令中使用变量来构造上游地址时,$proxy_port在大多数情况下会是一个空字符串。
set $upstream http://dynamic-backend;
proxy_pass $upstream;
# 在这种情况下,$proxy_port 的值通常是 `""`(空)
原因:Nginx 在配置解析阶段无法确定变量 $upstream最终的值,因此也无法从中提取出端口号。$proxy_port是在Nginx运行时内部设置的,对于变量形式的代理目标,这个信息可能无法被正确捕获
$server_port变量
处理当前请求的 Nginx server块所监听的TCP端口号
该文章在 2026/4/10 9:44:56 编辑过