服务器只持有一个网站吗?

use*_*319 80 dns ip webserver

据我了解,DNS将域名与存储网站的服务器的IP地址联系起来,这是否意味着每个服务器只能容纳一个网站?如果他们没有,如果同一台服务器上有很多网站,调用服务器的IP地址如何知道我想要哪个网站?

Bob*_*Bob 149

基本上:浏览器在 HTTP 请求中包含域名,因此网络服务器知道请求的是哪个域并可以相应地响应。


HTTP 请求

以下是您的典型 HTTP 请求是如何发生的:

  1. 用户以 形式提供一个 URL http://host:port/path

  2. 浏览器提取 URL 的主机(域)部分,并在必要时将其转换为 IP 地址,这个过程称为名称解析。这种转换可以通过 DNS 进行,但不是必须的(例如,hosts常见操作系统上的本地文件绕过 DNS)。

  3. 浏览器打开到指定端口的 TCP 连接,或默认为该 IP 地址上的端口 80。

  4. 浏览器发送 HTTP 请求。对于 HTTP/1.1,它看起来像这样:

    GET /path HTTP/1.1
    Host: example.com
    
    Run Code Online (Sandbox Code Playgroud)

    Host标头是标准的,在 HTTP/1.1 中是必需的。它没有在 HTTP/1.0 规范中指定,但一些服务器无论如何都支持它。)

从这里开始,网络服务器有几条信息可以用来决定响应应该是什么。请注意,单个 Web 服务器可以绑定到多个 IP 地址。

  • 请求的 IP 地址,来自 TCP 套接字
    • 客户端的 IP 地址也可用,但很少使用 - 有时用于阻止/过滤
  • 请求的端口,来自 TCP 套接字
  • 请求的主机名,Host由浏览器在 HTTP 请求的标头中指定。
  • 请求的路径
  • 任何其他标头(cookies 等)

您似乎已经注意到,如今最常见的共享主机设置将多个网站放在一个 IP 地址:端口组合上,仅Host用于区分网站。

这在 Apache 领域被称为基于名称的虚拟主机,而 Nginx在服务器块中将它们称为服务器名称,而 IIS 更喜欢Virtual Server


HTTPS 呢?

HTTPS 有点不同。在建立 TCP 连接之前,一切都相同,但之后必须建立加密的 TLS 隧道。目标是不泄露有关请求的任何信息。

为了验证服务器是否实际拥有此域,服务器必须发送由受信任的第三方签署的证书。然后浏览器会将此证书与其请求的域进行比较。

这提出了一个问题。如果在收到 HTTP 请求之前需要这样做,服务器如何知道要发送哪个主机(网站)的证书?

传统上,这是通过为每个需要 HTTPS 的网站使用专用 IP 地址(或端口)来解决的。显然,当我们开始耗尽 IPv4 地址时,这会成为问题。

输入SNI(服务器名称指示)。浏览器现在会在 TLS 协商期间传递主机名,因此服务器可以尽早获得此信息以发送正确的证书。在服务器端,配置与 HTTP 虚拟主机的配置方式非常相似。

缺点是主机名现在在加密之前以纯文本形式传递,并且本质上是泄露的信息。考虑到主机名通常会在 DNS 查询中公开,这通常被认为是可以接受的折衷方案。


如果您仅通过 IP 地址请求站点怎么办?

当服务器不知道您请求的是哪个特定主机时,它会做什么取决于服务器的实现和配置。通常,指定的“默认”、“catchall”或“回退”站点将对所有未明确指定主机的请求提供响应。

这个默认站点可以是它自己的独立站点(通常会显示错误消息),也可以是服务器上的任何其他站点,具体取决于服务器管理员的偏好。


Len*_*nne 91

我对非技术人员有这种解释。

杰克、吉尔和乔住在一个宿舍里,他们没有手机。

在电话簿中,它们都以相同的号码列出。(一个记录)

你拨了号码,有人接了电话;你说“我想和吉尔说话”,然后你就让她上线了。

电话簿中可能没有A记录(电话号码/IP地址),可能只是说“X宿舍”,然后您必须进一步查找X宿舍的号码。这是一个CNAME记录。

如果吉尔不在,你可能会得到

  • 404 吉尔不在
  • 410 吉尔死了。
  • 301吉尔和彼得同住
  • 302 吉尔正在拜访彼得,改为给他打电话

  • 400我无法理解你。

  • 401 你是谁?密码是什么?或者晚上 10 点后我们不允许男性来电
  • 402 需要付款(你确定吉尔是她的真名吗 ;-) )
  • 403 不,那不是正确的密码。
  • 418 吉尔是个茶壶 :-)
  • 429 吉尔不能再接听电话了。
  • 451 你违反了限制令。

  • 500 我们的电话系统坏了。


plu*_*ash 6

据我了解,DNS将域名与存储网站的服务器的IP地址联系起来,这是否意味着每个服务器只能容纳一个网站?

首先,您需要了解这里有许多不同的概念。

  • 网站,一组构成一个连贯整体的网页。
  • IP 地址,互联网协议用作流量源或目的地的数字地址(IPv4 为 32 位,IPv6 为 128 位)。
  • 服务器,一台机器,其工作是为来自客户端的请求提供服务。
  • 主机名,用于在 DNS 中标识机器的名称(例如“www.example.com”或“en.wikipedia.org”)

这些东西之间没有一对一的关系。一台服务器可以有多个IP地址;多个主机名可以指向一个 IP 地址;一个主机名可以指向多个 IP 地址。多个网站可以在同一个主机名下。一个网站可以分布在多个主机名上。

如果他们没有,如果同一台服务器上有很多网站,调用服务器的IP地址如何知道我想要哪个网站?

在过去(HTTP 1.0 及之前),服务器想要以不同方式处理的每个主机名都必须有自己的 IP 地址。这是比较浪费的。

HTTP 1.1Host在 HTTP 请求中添加了“标头作为必填字段(IIRC 一些供应商以前支持将此作为扩展)。这告诉服务器已请求哪个主机名,因此允许它为同一主机上的不同主机名提供不同的内容。 IP 地址。现在客户端中对 HTTP 1.1 的支持无处不在。

不幸的是,SSL(后来的 TLS)增加了一个问题。建立 SSL/TLS 会话需要服务器向客户端提供涵盖所请求主机名的证书,但 HTTP 请求直到 SSL/TLS 会话建立后才会到达。

通过使用该SubjectAltName字段或在该CommonName字段中使用通配符,可以让一个证书涵盖多个主机名。但是,这会带来管理上的挑战,尤其是当所涉及的主机名位于具有不同所有权的域下时。

所以 TLS 引入了“服务器名称指示”(SNI)扩展。通过此扩展,客户端在 TLS 握手过程中将请求的主机名发送到服务器。然后服务器可以提供适当的证书。不幸的是,虽然所有主要 SSL/TLS 实现的当前版本都支持 SNI,但旧版本需要很长时间才能停止使用。