虚拟主机是如何做到不同域名都解析到同一个IP?
时间:2024-01-24 03:45:01 | 来源:网站运营
时间:2024-01-24 03:45:01 来源:网站运营
虚拟主机是如何做到不同域名都解析到同一个IP?:做域名解析的是可不是虚拟主机,而是dns服务器。比如你有三个域名:
http://a.b.com;
http://c.d.com,
http://e.f.com,它们对应三台虚拟主机,但是却共用同一个ip:1.2.3.4。
这时候在dns服务器上配置这三个域名与ip的映射关系如下:
a.b.com A 1.2.3.4
c.d.com A 1.2.3.4
e.f.com A 1.2.3.4
可以发现这三个个域名都映射到同一个ip,也就是实现了你说的不同域名解析到同一个ip。
仔细观察这映射关系里面都有一个A,这个A是dns里面的术语A记录,域名到ip的映射,dns称之为A记录。
说完dns部分,再说http部分。
在浏览器里面输入
http://a.b.com或者
http://c.d.com或者
http://e.f.com后,首先会找dns服务器做解析得到服务器ip地址1.2.3.4。
可能你会问浏览器咋知道dns服务器是谁?在你网卡上有配置(dhcp拿到或者静态配置的)。
上门说到浏览器根据域名拿到了服务器ip,然后发起http请求。该http请求包里面有两个地方注意下。
一个是1.2.3.4作为http请求数据包目的ip地址,这样数据包就可以据此找到服务器了,说是找到,其实专业说法叫路由寻址。
还有一个是域名(三个中的一个,看你输入哪个就是哪个),会放到http请求数据包中http header的host字段。
有了目的ip地址,网络就可以把你浏览器的http请求包,正确转发到服务器。
有了http host字段,当http请求包到了服务器后,服务器根据此host值,匹配你在nginx或apache上配置的多个虚拟主机(server name)。
找到后就继续虚拟主机配置的其他操作,并响应请求。如果找不到,也就是http host不匹配虚拟主机的server name,就走默认的虚拟主机。
如果你的虚拟主机,启用了ssl,会是怎样?
在dns完全相同,不过这时候查找虚拟主机时,不是根据http host匹配server name。
因为http被ssl加密了,服务器看不到http host内容,这时候难道说虚拟主机就没用了吗?肯定不是,怎么做?
当你在浏览器输入
https://a.b.com或
https://c.d.com或
https://e.f.com后,记住啊这时候不是http而是https。
浏览器会在发https请求前,先ssl握手(tcp部分省略,因为http、https都有tcp三次握手,在这里没啥区别)。
ssl握手的第一个包client hello,有个字段叫sni就携带以上三个域名的一个,当ssl client hello到了服务器后,服务器根据此字段的域名去匹配虚拟主机的server name。
匹配机制同http,匹配上后,回复ssl server hello,并且也把该虚拟主机上配置的server certificate恢复给浏览器。
浏览器拿到server hello、server certificate后,继续ssl握手直至完成。
在发https请求,其实还是http,只是加了密的http,给到服务器上指定的虚拟主机,然后由此虚拟主机回复。
可以发现,此时的https也带了http host,但是此时的虚拟主机,已经定下来了。在查找虚拟主机时,https包都没有,http host没啥作用,它的工作由ssl client hello的sni完成了。