Nginx允许多个server{}块监听相同的端口,所以当访问相同端口、不同域名的请求到达时,还需要根据请求中的域名做第2次匹配,以决定最终关联的server{}块。
这里我们先要搞清楚域名是怎么从HTTP请求中取出来的。在HTTP/1.0协议中并没有Host头部,这是因为互联网起步时,HTTP的设计者并没有考虑到域名的数量会远多于服务器。对于HTTP/1.0请求而言,只能从absoluteURL中携带域名。
举个例子,下面这个没有携带Host头部的请求可以取到www.taohui.pub域名:
GEThttp://www.taohui.pub/index.htmlHTTP/1.
互联网业务的推动导致一台服务器必须要处理大量域名,于是HTTP/1.1协议推出了描述访问域名的Host头部。对于不含有Host头部的HTTP/1.1请求,RFC规范要求服务器必须返回400错误码(Nginx也正是这么做的)。当Host头部与上述absoluteURL中的域名同时出现时,将会以后者为准。例如对于下面这个请求,Nginx会取出www.taohui.tech作为匹配域名:
GEThttp://www.taohui.tech/index.htmlHTTP/1.0
Host:www.taohui.pub
另外,对于使用了TLS/SSL协议的HTTPS请求来说,还可以从TLS握手中获取到域名。关于TLS握手及相关插件我会在后续的文章中再详述。
获取到请求的域名后,Nginx就会将其与上一节中listen指令匹配成功的server块进行第2次匹配,