子域如何传递到Web服务器?


12

我知道dns会将example.com之类的地址解析为11.22.33.44之类的IP地址,但是我对如何解析子域感到有些困惑,因此当您输入http://subdomain.example.com时,实际上传递给服务器11.22.33.44?换句话说,example.com = 11.22.33.44,但subdomain.example.com/path = ???

是将“子域”和“路径”作为http标头传递,还是以某种方式映射到url中?

提前致谢。

编辑:如果我正确理解,BloodPhilia说subdomain.example.com实际上是一个不同的域,原则上可以解析为完全不同的IP。但是,如果是这样的话,那么拥有大量(看起来像)子域但实际上映射到站点上某些路径的主机呢?例如,blogspot托管了数百万个blog,它们看起来都像这样:

aaa.blogspot.com
bbb.blogspot.com
...millions more...
yyy.blogspot.com
zzz.blogspot.com

这些显然不是具有自己IP的子域,而是诸如aaa.blogspot.com-> www.blogspot.com/aaa之类的映射,但是这是如何实现的呢?实际传递到blogspot.com上的Web服务器的是什么?

Answers:


18

DNS,最终用户和Web服务器对域,子域,子子域和Sub(x)-子子域(最后两个!)的处理方式完全相同。

例如,DNS服务器可以返回不同的结果domain.comwww.domain.commysite.domain.com

现在,您可能已经知道,世界上有比IP多得多的域。

因此,服务器使用称为“主机头”的东西来提供正确的内容。

不管您实际请求什么,您的计算机都将处理所有相同的事情-它会在DNS上查找应连接到的IP,一旦连接,它将发送主机标头作为请求的一部分。然后,Web服务器发回配置为发回的内容。

Wfetch是测试/学习/诊断的好工具,可以在此处下载

这是访问superuser.com时发送的标头的示例

替代文字

这是IIS(Web服务器)中主机头的配置:

替代文字

(图片来自这里

如果您有兴趣,则Serverfault.com和Superuser.com位于同一IP上,这是用于分隔站点并提供不同内容的技术。

有关此主题的更多信息,您可能需要阅读有关虚拟主机的Wikipedia文章

(我知道您了解基本知识,但我想多说一点是有益的,这样,使用此方法的任何Google人士都可以学到一点!)

编辑

因此,按照您的示例,我猜想像blogspot一样大的人最有可能指向一个负载均衡器的通配符DNS条目(通配符条目对任何查询返回相同的结果),然后负载均衡器会将其发送出去到许多不同的Web服务器,每个主机标头可能没有单独的站点,而是解析了键入地址(无论是否为主机标头)的单个站点/脚本,然后从那里的CDN中提取正确的内容。

尽管它们也可能(但不太可能)每个IP仅具有数千个条目,但该IP会导致一些服务器,并且对于具有匹配主机头的每个站点,它们仅具有一个条目。


1
真好!旁注:两个网站共享一个IP地址这一事实并不一定意味着它们始终托管在同一台计算机上。实际上,负载均衡器可能还会窥视这些标头并将其委派给其他计算机。(对于“超级用户”等人,另请参阅Stack Overflow的纽约数据中心,尽管我并未真正读过自己……)
Arjan

@Arjan +1好点...我提到了负载均衡器,但显然它可能只是负载均衡器的IP,然后将请求拆分到许多服务器。
William Hilsum

1
标记为详细信息的答案以及进一步研究的链接。谢谢!
约书亚·弗兰克

6

实际上,如果两个域具有相同的IP地址,则服务器将依靠浏览器来指定请求的域。

GET / HTTP/1.1
Host: data.stackexchange.com

3

子域名不是正确的词。通常,子域是自己的域,因此sub.example.com首先会传递给DNS,如果未找到该子域的特定记录,则请求会传递给顶级域的IP。(example.com)在该服务器上再次发出请求,服务器将采取相应行动。

换句话说,对example.com的请求与对sub.example.com的请求实际上并没有什么不同。


我想也许我对这里的一些重要内容不了解。让我编辑并澄清我的问题。谢谢。
约书亚(Joshua Frank)

您是说如果sub.example.com无法解析,将使用IP地址example.com吗?我认为浏览器不会这样做。(除非有通配符DNS记录,但我会说,子域实际上会解析。)
Arjan

1

Subdomain.example.com不能解析为11.22.33.44-就您的问题而言,它通常具有自己的DNS A记录,并解析为其他地址。

可以允许将子域解析为与父域相同的地址,并且仍在不同页面上进行服务器处理,但是如果这样做,则必须将两个站点都托管在同一Web服务器上,并且需要在服务器的配置中进行说明。解决方法取决于您正在运行的Web服务器类型。


1
您是说在我的blogspot示例中,“ xyz.blogspot.com”将没有专用的dns条目,因此dns将寻找“ blogspot.com”并在11.22.33.44处找到它。但是它将把整个URL“ xyz.blogspot.com”作为主机字段发送,并且由服务器来解析此并将xyz页面发送到浏览器吗?
约书亚·弗兰克

是的,这是对的。
Joel Coehoorn

nslookup dummy.example.com产量server can't find dummy.example.com-那与上面的情况如何匹配?(例如@Joshua评论中的示例?)
Arjan

抱歉,您的子域仍然需要A记录-只是如果您愿意,它可以提供相同的IP。
Joel Coehoorn

然后我又感到困惑。如果有数百万个xyz.blogspot.com子域,它们不能都具有A记录,那么如何完成路由?而A记录配置是在服务器端。我对给定URL的客户端如何知道xyz是正确的子域还是映射到服务器端的东西感兴趣。特别是,缓存IP一段时间是否永远安全,因为您知道x.domain.com和y.domain.com在同一台服务器上,还是永远无法仅通过查看URL来知道?
约书亚·弗兰克
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.