Aaron Lau(韩栖)

Nginx 学习笔记 (a2) —— $host、$http_host 与 $server_name

352 字

$host 的值,首先是请求行中的 host name,打个比方,GET http://example.com/ HTTP/1.1 中的 host name 就是 example.com;然后是请求头内 Host 字段的值;最后是匹配成功的 server name,有点儿“调剂”的意思。值得留意,$host 总是小写且不带端口号。

$http_host 的值,其实就是请求头中 Host 字段的值。同理可得请求头中任意字段的值,如 User-Agent 就可以用 $http_user_agent 来调用。它可简单理解为(但不等同)$host:$server_port。另外 $proxy_port 为 backend 的端口,通常会隐藏起来,如 8080;$server_port 为客户端访问 frontend 使用的端口,如 80。

$server_name 的值,是实际处理该请求的 server block 的 server_name。Nginx 分发请求时,会依据客户端请求的 Host 按优先级逐次匹配:首先做精确匹配,其次查找通配符 * 开头的,再次查找通配符 * 结尾的,最后以正则表达式做模糊匹配。

若请求的 Host 匹配不上(或许根本是空值),则分派给默认的 server,可以在 listen 指令中附上 default_server 参数来指定。若没有指定,该请求将会走 http block 里面的第一个 server block。减少攻击面计,实务上应返回 444 以关闭连接。

server {
    listen 80 default_server;
    server_name _;
    return 444;
}

<small>原载 App-scope,有删改。</small>

App-scope · 教程 · Nginx