Nginx 学习笔记 (a2) —— $host、$http_host 与 $server_name
$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>