为什么输入 IP 地址而不是相应的域名却无法显示网站?

为什么输入 IP 地址而不是相应的域名却无法显示网站?
> host example.com
example.com has address 93.184.216.34
example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946

我在 Chrome 中输入了93.184.216.34而不是http://example.com。它无法加载网站。为什么?

答案1

因为通常需要正确的 HTTPHost标头才能真正获取目标站点。

Host在同一个 IP 地址上托管多个网站并根据客户端指定的 HTTP 标头(以及如今 HTTPS 情况下的 TLS SNI 值)区分它们是很常见的。

也就是说,当您http://example.com在浏览器中输入 时Host,标头为example.com,但当您输入 时则不是这样93.184.216.34。在这两种情况下,您都会访问同一个 Web 服务器,但会收到不同的响应(在此特定情况下为 200 与 404)。

答案2

因为通常 Web 服务器使用“虚拟服务器”技术,能够根据您请求的域名(而不是 Web 服务器的 IP 地址)回答您的 HTTP 请求。这要归功于在一个 IP 地址上隐藏了多个域名。

例如,阿帕奇Web 服务器能够使用以下部分通过 IP 地址响应您的 HTTP 请求:

<VirtualHost *:80>
ServerName Default
...
</VirtualHost>

或者配置中根本没有使用 VirtualHost。

Apache 中的 VirtualHost 功能于 1996 年推出。

答案3

阿帕奇,您可以使用一个 IP 地址托管多个网站。这称为虚拟托管。这是创建子域甚至独立域的方法。这是通过设置一个包含每个域/子域的 VirtualHost 指令的 Apache 配置文件来完成的。

具有两个虚拟主机 example1.com 和 example2.com 的示例 HTTP 服务器如下所示(IP 地址定义):

<VirtualHost 93.184.216.34:80>
  ServerName example1.com
  ServerAlias www.example1.com
  DocumentRoot /var/www/example1.com
</VirtualHost>

<VirtualHost 93.184.216.34:80>
  ServerName example2.com
  ServerAlias www.example2.com
  DocumentRoot /var/www/example2.com
</VirtualHost>

它也可以看起来像这样(基于名称的定义):

<VirtualHost *:80>
  ServerName example1.com
  ServerAlias www.example1.com
  DocumentRoot /var/www/example1.com
</VirtualHost>

<VirtualHost *:80>
  ServerName example2.com
  ServerAlias www.example2.com
  DocumentRoot /var/www/example2.com
</VirtualHost>

在这两种情况下,都会在内存中内部创建两个虚拟主机记录,并由 Apache 用于与 URI 请求到达时进行比较。

当用户通过用户代理输入 IP 地址时,配置文件中列出的第一个虚拟主机将用作主域(即在本例中为 example1.com)。

当用户输入域名时,请求会被发送到公共互联网 DNS 网络 (ICANN),该网络会提供与其关联的 IP 地址。您通过 ICANN 注册商 (如 GoDaddy) 注册了这两个域名。您必须确保这两个域名都正确无误,并等待一段时间,然后才能将域名传播到 ICANN 网络上的所有 DNS 服务器。目前,这可能需要长达 24 小时。

当请求路由到您的 Apache HTTP 服务器时,IP 地址和域名将与内部 VirtualHost 记录列表进行匹配。如果找到一个,则使用文档根目录来形成对象资源的完整文件系统路径,以返回给用户代理。如果没有,则发送 HTTP 404 以及与其相关的任何错误文档。

答案4

搜索的关键词是“基于名称的虚拟主机”。

人们希望将多个主机名分配给同一个 Web 服务器,并为每个主机名提供不同的内容。这称为虚拟托管(不要与较新的虚拟机概念混淆)。

最初虚拟主机是通过为服务器分配多个 IP 地址来实现的,然后服务器可以根据所使用的 IP 地址发送不同的内容,但这被视为浪费。

因此引入了“host”标头,最初是作为扩展,但后来在 1997 年成为 http 1.1 规范的强制性部分。此标头指定客户端请求的主机名。然后服务器可以根据标头的值提供不同的内容。

相关内容