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

Per*_*ror 39 ip google-chrome

> host example.com
example.com has address 93.184.216.34
example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
Run Code Online (Sandbox Code Playgroud)

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

Håk*_*ist 109

因为Host通常需要正确的 HTTP标头才能实际获取预期站点。

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

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

  • @SergiyKolodyazhnyy 当然。你可以`curl -H "Host: example.com" http://93.184.216.34/` 或类似的东西。 (19认同)
  • 解释一下 - “网站的 URL 和 IP 地址之间没有一对一的关系。” (13认同)
  • 有人可以扩展一下`Host`的作用以及Web服务器通常将它用于什么吗?在网上搜索有点困难,因为这个词太多了。 (4认同)

小智 14

因为通常网络服务器使用“虚拟服务器”技术,并且能够在您请求的域名内响应您的 HTTP 请求,而不是网络服务器的 IP 地址。由于在一个 IP 地址上隐藏了多个域名。

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

<VirtualHost *:80>
ServerName Default
...
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

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

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


小智 10

Apache 中,您可以仅使用一个 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>
Run Code Online (Sandbox Code Playgroud)

它也可以是这样的(基于名称的定义):

<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>
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,两个虚拟主机记录都是在内存中内部创建的,Apache 使用它来比较 URI 请求何时到达。

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

当用户输入域名时,请求被发送到公共互联网 DNS 网络 (ICANN),该网络提供与其关联的 IP 地址。您通过 ICANN 注册商(如 GoDaddy)注册了两者。您必须正确完成这两项工作,并在传播到 ICANN 网络上的所有 DNS 服务器之前留出一些时间。如今,这可能需要长达 24 小时。

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


Chr*_*max 8

我喜欢使用“房子”这个术语。

你可以很容易地把一封信寄给一个没有名字的房子,它会到达房子。

如果你把这个人的名字写在上面,那么你就是发送给预期的收件人。

目的地是一样的,但到达房子时的处理方式不同。

当您指定站点(即 www.example.com)时,服务器就知道如何处理请求以及它的目标主机和返回服务的站点。