> 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中输入。它不会加载网站。为什么?
> 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中输入。它不会加载网站。为什么?
Answers:
因为Host
通常需要正确的HTTP 标头才能真正获得目标站点。
通常,将多个网站托管在同一个IP地址上,并根据Host
客户端指定的HTTP 标头(以及如今使用HTTPS的TLS SNI值)来区分它们。
也就是说,当您进入http://example.com
浏览器时,Host
标题为example.com
,但并非如此93.184.216.34
。在这两种情况下,您都到达同一台Web服务器,但是收到的响应不同(在这种情况下,是200与404)。
Host
它的功能以及通常用于什么Web服务器吗?很难在网上进行搜索,因为这个词太重了。
curl -H "Host: example.com" http://93.184.216.34/
或类似的东西。
example.com example.net example.org example.edu
在相同的地址上进行处理,这就是为什么它确实需要Host标头中的名称。
因为通常Web服务器使用“虚拟服务器”技术,并且能够在您所请求的域名内(而不是Web服务器的IP地址)在您的HTTP请求上进行应答。多亏在一个IP地址上隐藏多个域名。
例如,Apache Web服务器能够使用以下部分使用IP地址来响应您的HTTP请求:
<VirtualHost *:80>
ServerName Default
...
</VirtualHost>
或者如果在配置中根本没有使用VirtualHost。
Apache中的VirtualHost功能于1996年引入。
在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以及与其关联的任何错误文档。
我喜欢使用“房屋”术语。
您可以很容易地将一封没有名字的信寄给房屋,然后它将到达房屋。
如果在上面贴上该人的名字,那么您将发送给预期的收件人。
目的地是相同的,但到达房屋时的处理方式不同。
当您指定站点(即www.example.com)时,服务器就会知道如何处理该请求,请求的主机以及要回送的站点。
搜索的关键术语是“基于名称的虚拟主机”。
人们希望将多个主机名分配给同一台Web服务器,并为每个主机名提供不同的内容。这就是所谓的虚拟主机(不要与虚拟机的最新概念相混淆)。
最初,虚拟主机是通过向服务器分配多个IP地址来完成的,然后服务器可以根据所使用的IP地址发送不同的内容,但这被认为是浪费的。
因此,引入了“主机”标头,最初是作为扩展,但后来在1997年成为http 1.1规范的强制性部分。此标头指定了客户端要求的主机名。然后,服务器可以根据标头的值提供不同的内容。
为了降低Web服务器的成本,许多Web服务器托管多个网站。他们通过使用apache2 / nginx / etc中的虚拟主机或虚拟主机来执行此操作。因此,如果直接访问该网站的IP地址,则很可能会看到“ Apache正在运行”屏幕,甚至可能会重定向到Web服务器的主网站。
虚拟主机查看传入的网站地址,并将其与已启用的虚拟主机文件中的ServerName或ServerAlias名称进行比较。如果其中之一匹配,则将加载该特定网站。
除非网站具有大量负载(大量唯一身份访问者/页面浏览量)或驱动高负载应用程序(例如youtube.com,facebook等),否则在共享服务器上进行操作可能更具成本效益。仅运行一个Wordpress博客网站而获得专用服务器(起价为60美元/月),将是浪费金钱。一台服务器上最好有一个共享平台,一台服务器上可能有200多个网站。每月$ 5左右的费用会更高。
这样做的另一个原因是缺少IP地址。根本没有足够的IPv4地址剩余。只有通过将NAT用于家庭/企业网络以及使用Vhost,我们才有任何剩余。即使当IPv6成为主流时,服务器也可能会坚持使用Vhosts(服务器成本)。
专用IP地址非常昂贵,而在服务器上创建新网站基本上是免费的。
发生的情况是,托管公司租用一个指向物理服务器的IP地址,然后使用“虚拟主机”功能在该IP地址上托管数千个网站
就像邮政信箱一样,如果您只写下邮局地址但没有邮政信箱号码,则邮件将不会被发送。
这里有很多关于技术细节的答案,但是我认为最简单的高层解释是,即使Web服务器在其IP地址上正确侦听HTTP流量,通常也必须将服务器配置为针对特定域进行回答名称,并且该名称必须在客户端(即Web浏览器)发送的请求中
我之所以说“通常”是因为它几乎总是以这种方式完成的,但是实际上有一些方法可以将http服务器设置为仅使用IP地址来回答。
我们需要了解虚拟IP和专用IP之间的区别。
如果网站具有专用(非共享)IP,则(例如)http://123.456.789.012将打开该网站。
试试这个,这是一个网站,我自己,www.negativeiongenerators.com的专用IP地址: http://75.126.128.174 但正如其他人所说的,这通常不是一个好主意。