管理杂谈OA答疑ERP答疑教程搜索

分清这些变量:Nginx 中几个易混的 $host与 $port


$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端口号


更多精彩文章浏览...
点击右上角图标分享到朋友圈
官方网站:http://www.clicksun.cn
咨询热线:400-186-1886
服务邮箱:service@clicksun.cn