为什么输入IP地址而不是相应的域名不能显示网站?[关闭]


38
> host example.com
example.com has address 93.184.216.34
example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946

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


根据经验,除非配置实际服务器,否则人类永远不要使用IP地址。
David Richerby

值得强调的是,您确实从服务器获得了响应:404 HTTP响应。这意味着它成功找到了主机(另一侧的计算机)和在该主机上运行的一些Web服务器(在Linux上运行的某种开源软件,例如Nginx)回送了数据。
jpmc26

Answers:


107

因为Host通常需要正确的HTTP 标头才能真正获得目标站点。

通常,将多个网站托管在同一个IP地址上,并根据Host客户端指定的HTTP 标头(以及如今使用HTTPS的TLS SNI值)来区分它们。

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


4
有人可以扩展一下Host它的功能以及通常用于什么Web服务器吗?很难在网上进行搜索,因为这个词太重了。
user1717828 '18

1
tools.ietf.org/html/rfc7230#section-5.4无论如何 ,http服务器都会处理Host标头。例如,httpd具有VirtualHost配置指令。
John Mahowald '18

19
@SergiyKolodyazhnyy好的。你可以curl -H "Host: example.com" http://93.184.216.34/或类似的东西。
哈坎·林德奎斯特

13
解释一下-“网站的URL与IP地址之间没有一对一的关系。”
皮特

1
实际上,特定的服务器(93.184.216.34 2606:2800:220:1:248:1893:25c8:1946)至少 example.com example.net example.org example.edu在相同的地址上进行处理,这就是为什么它确实需要Host标头中的名称。
dave_thompson_085 '18

14

因为通常Web服务器使用“虚拟服务器”技术,并且能够在您所请求的域名内(而不是Web服务器的IP地址)在您的HTTP请求上进行应答。多亏在一个IP地址上隐藏多个域名。

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

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

或者如果在配置中根本没有使用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>

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

<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)。

当用户键入域名时,该请求将发送到公共Internet DNS网络(ICANN),该网络提供与之关联的IP地址。您都通过ICANN注册商(例如GoDaddy)进行了注册。您必须正确设置所有这两项,并留出一些时间,才能将传播控制在ICANN网络上的所有DNS服务器上。这些天最多可能需要24个小时。

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


8

我喜欢使用“房屋”术语。

您可以很容易地将一封没有名字的信寄给房屋,然后它将到达房屋。

如果在上面贴上该人的名字,那么您将发送给预期的收件人。

目的地是相同的,但到达房屋时的处理方式不同。

当您指定站点(即www.example.com)时,服务器就会知道如何处理该请求,请求的主机以及要回送的站点。


这是一个有用的隐喻!
Redwolf节目

+1我喜欢收件人姓名的想法。我在想类似的类比,但IP地址标识了物理建筑物(计算机),而公寓号(域名)则标识了多租户建筑物中的实际接收者。当然,这过于简单了,多租户计算机可以将仅IP地址服务器作为默认站点,但是我认为这是一个很好的类比。
jmbertucci

0

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

人们希望将多个主机名分配给同一台Web服务器,并为每个主机名提供不同的内容。这就是所谓的虚拟主机(不要与虚拟机的最新概念相混淆)。

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

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


“但是这被认为是浪费。”仅适用于旧版v4连接。现在可以在不同的v6地址上设置每个虚拟主机。
Qwertie

1
与仅使您的面向公众的服务IPv6成为合理的事情相比,我们还有很长的路要走。
彼得·格林

0

为了降低Web服务器的成本,许多Web服务器托管多个网站。他们通过使用apache2 / nginx / etc中的虚拟主机或虚拟主机来执行此操作。因此,如果直接访问该网站的IP地址,则很可能会看到“ Apache正在运行”屏幕,甚至可能会重定向到Web服务器的主网站。

虚拟主机查看传入的网站地址,并将其与已启用的虚拟主机文件中的ServerName或ServerAlias名称进行比较。如果其中之一匹配,则将加载该特定网站。

除非网站具有大量负载(大量唯一身份访问者/页面浏览量)或驱动高负载应用程序(例如youtube.com,facebook等),否则在共享服务器上进行操作可能更具成本效益。仅运行一个Wordpress博客网站而获得专用服务器(起价为60美元/月),将是浪费金钱。一台服务器上最好有一个共享平台,一台服务器上可能有200多个网站。每月$ 5左右的费用会更高。

这样做的另一个原因是缺少IP地址。根本没有足够的IPv4地址剩余。只有通过将NAT用于家庭/企业网络以及使用Vhost,我们才有任何剩余。即使当IPv6成为主流时,服务器也可能会坚持使用Vhosts(服务器成本)。


0

专用IP地址非常昂贵,而在服务器上创建新网站基本上是免费的。

发生的情况是,托管公司租用一个指向物理服务器的IP地址,然后使用“虚拟主机”功能在该IP地址上托管数千个网站

就像邮政信箱一样,如果您只写下邮局地址但没有邮政信箱号码,则邮件将不会被发送。


0

这里有很多关于技术细节的答案,但是我认为最简单的高层解释是,即使Web服务器在其IP地址上正确侦听HTTP流量,通常也必须将服务器配置为针对特定域进行回答名称,并且该名称必须在客户端(即Web浏览器)发送的请求中

我之所以说“通常”是因为它几乎总是以这种方式完成的,但是实际上有一些方法可以将http服务器设置为仅使用IP地址来回答。


-1

我们需要了解虚拟IP和专用IP之间的区别。

如果网站具有专用(非共享)IP,则(例如)http://123.456.789.012将打开该网站。

试试这个,这是一个网站,我自己,www.negativeiongenerators.com的专用IP地址: http://75.126.128.174 但正如其他人所说的,这通常不是一个好主意。


1
这并非普遍如此。这取决于Web服务器配置。您可以拥有专用的IP地址,但没有主机也无法响应IP,还可以具有共享的IP地址,并且IP地址指向服务器上的网站之一。允许仅通过其ip地址访问网站也没有什么问题,尽管这也不是特别有用。
Qwertie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.