据我了解,DNS链接的域名和网站存储服务器的IP地址,是否意味着每台服务器只能容纳一个网站?如果没有,那么如果同一服务器上有很多网站,调用服务器的IP地址怎么知道我想要哪个网站?
据我了解,DNS链接的域名和网站存储服务器的IP地址,是否意味着每台服务器只能容纳一个网站?如果没有,那么如果同一服务器上有很多网站,调用服务器的IP地址怎么知道我想要哪个网站?
Answers:
基本上:浏览器在HTTP请求中包含域名,因此Web服务器知道请求了哪个域并可以做出相应的响应。
这是典型的HTTP请求的发生方式:
用户以形式提供URL http://host:port/path
。
浏览器提取URL的主机(域)部分,并在必要时将其转换为IP地址,此过程称为名称解析。该转换可以通过DNS进行,但不是必须的(例如,hosts
常见OS上的本地文件会绕过DNS)。
浏览器在该IP地址上打开到指定端口的TCP连接,或默认为端口80。
浏览器发送HTTP请求。对于HTTP / 1.1,它看起来像这样:
GET /path HTTP/1.1
Host: example.com
(Host
标头是标准的,在HTTP / 1.1中是必需的。HTTP/ 1.0规范中未指定标头,但是某些服务器仍然支持它。)
从这里开始,Web服务器具有一些信息,可用来确定响应应该是什么。请注意,单个Web服务器可能绑定到多个IP地址。
Host
浏览器在HTTP请求的标头中指定的请求的主机名。您似乎已经注意到,如今最常见的共享主机设置是将多个网站放在一个IP地址:端口组合上,仅Host
用于区分两个网站。
这在Apache-land中被称为基于名称的虚拟主机,而Nginx 在服务器块中将它们称为服务器名称,而IIS则更喜欢Virtual Server。
HTTPS有所不同。直到建立TCP连接为止,所有内容都是相同的,但此后必须建立加密的TLS隧道。目的是不泄漏有关请求的任何信息。
为了验证服务器实际上拥有此域,服务器必须发送由受信任的第三方签名的证书。然后,浏览器将将此证书与其请求的域进行比较。
这带来了问题。如果服务器需要在接收HTTP请求之前执行此操作,服务器如何知道要发送的主机(网站)的证书?
传统上,这是通过为每个需要HTTPS的网站设置专用IP地址(或端口)来解决的。显然,随着我们开始用尽IPv4地址,这成为问题。
输入SNI(服务器名称指示)。现在,浏览器在TLS协商期间传递了主机名,因此服务器足够早地具有此信息以发送正确的证书。在服务器端,配置与HTTP虚拟主机的配置非常相似。
缺点是主机名现在在加密之前以纯文本形式传递,并且实质上是泄漏的信息。考虑到主机名通常总是在DNS查询中公开,因此通常认为这是可以接受的折衷方案。
服务器在不知道您请求的特定主机时会做什么,取决于服务器的实现和配置。通常,指定一个“默认”,“ catchall”或“后备”站点,该站点将提供对未明确指定主机的所有请求的响应。
此默认站点可以是其自己的独立站点(通常显示错误消息),也可以是服务器上的任何其他站点,具体取决于服务器管理员的偏好。
对于非技术人员,我有这种解释。
杰克,吉尔和乔住在宿舍,他们没有手机。
在电话簿中,它们都以相同的编号列出。(一个记录)
您拨打该号码,然后有人接了电话。你说“我想和吉尔说话”,你就让她上线了。
它可能只是说“ Dormitory X”,而不是电话簿中的A记录(电话号码/ IP地址),然后您必须进一步寻找Dormitory X的号码。这是CNAME记录。
如果Jill不可用,您可能会得到
卷302
400我不明白你的意思。
451您违反了限制令。
500我们的电话系统已损坏。
据我了解,DNS链接的域名和网站存储服务器的IP地址,是否意味着每台服务器只能容纳一个网站?
首先,您需要了解这里有许多不同的概念。
这些事物之间没有一对一的关系。一台服务器可以有多个IP地址;多个主机名可以指向一个IP地址;一个主机名可以指向多个IP地址。多个网站可以使用相同的主机名。一个网站可以分布在多个主机名上。
如果没有,那么如果同一服务器上有很多网站,调用服务器的IP地址怎么知道我想要哪个网站?
在过去(HTTP 1.0及更低版本),服务器要以不同方式处理的每个主机名都必须拥有自己的IP地址。这相当浪费。
HTTP 1.1 Host
在HTTP请求中添加了“标头作为必填字段(IIRC一些供应商以前已将此字段作为扩展名)。这告诉服务器已请求了哪个主机名,因此允许该服务器在同一主机上为不同的主机名提供不同的内容IP地址,客户端中对HTTP 1.1的支持现在无处不在。
不幸的是,SSL(后来的TLS)增加了麻烦。建立SSL / TLS会话要求服务器向客户端出示涵盖所请求主机名的证书,但是HTTP请求直到SSL / TLS会话建立后才到达。
通过使用该SubjectAltName
字段或在该CommonName
字段中使用通配符,可以使一个证书覆盖多个主机名。但是,这带来了管理上的挑战,尤其是当所涉及的主机名位于具有不同所有权的域下时。
因此,TLS引入了“服务器名称指示”(SNI)扩展名。使用此扩展名,客户端将在TLS握手过程中将请求的主机名发送到服务器。然后,服务器可以出示相应的证书。不幸的是,尽管所有主要SSL / TLS实现的当前版本都支持SNI,但较旧的版本却花了很长时间才能使用。
答案要比某些答案要复杂得多。当您执行DNS查找时,您必须获得IP地址(A
IPv4,AAAA
IPv6 记录)。您必须能够通过TCP / IP打开套接字进行通信,否则整个操作都会失败。该地址可能代表服务器,也可能代表负载均衡器。它甚至可以代表代理。例如,如果主机位于CloudFlare后面,则您获得的地址是CloudFlare服务器的地址。真正的服务器在其他地方。这使主机可以避免诸如拒绝服务攻击之类的问题。
虚拟主机就是您要问的问题(其他一些与此有关的问题,但没有任何细节)。虚拟主机接受Web请求并查看主机名(即domain.com),以确定要服务的网站。因此,在Apache HTTP Web服务器中,您将具有如下配置
<VirtualHost *:80>
ServerName www.domain.com
ServerAlias domain.com
DocumentRoot /var/www/domain.com
</virtualHost>
例如,这被简化。因此,我们要告诉Apache侦听任何IP的端口80(在托管您计算机IP的现代虚拟机中,其IP可能与实际IP不同)。然后,我们告诉它这是domain.com
网站以及该网站所在的目录。然后,我们可以一遍又一遍地重复此步骤,以告诉Apache处理不同的网站。每个Web服务器都支持这种类型的系统。
处理此问题的另一种方法是告诉Web服务器将所有Web流量定向到一个单独的编程脚本(即PHP,ASP.NET等),然后该单个脚本将确定要显示的网站和页面。
使用DNS,您可以根据需要为单个IP地址分配尽可能多的名称(例如,在主机文件中,您可以简单地用空格分隔每个名称)。使用DNS服务器,您还可以将多个IP地址分配给一个名称。它不限于一对一的关系。
Web服务器通过检查请求的URL 知道要服务的站点。它查看请求的域,请求的端口以及使用的协议。这与DNS无关,由HTTP协议处理。
Host:
标头中将没有域。在共享托管的情况下,提供商可以将Web服务器配置为以不同的方式处理此问题(例如,使用默认值,重定向到提供商等)。