我很好奇即使所有子域都指向同一个IP地址,Apache Web服务器如何检测子域,因为我的理解是一个IP地址不能有子域,并且每个域名最终都会解析为一个IP地址。
例子:
example1.domain.com resolves to => 192.24.17.65 take you to => example1 webpage
example2.domain.com resolves to => 192.24.17.65 take you to => example2 webpage
答案1
确实,在网络的早期,在单个 IP 上托管多个网站(不同的域、单个域的子域等)是不可行的。
然而,在 1999 年,开始向 HTTP 1.1 过渡,如今 HTTP 1.0 很少被使用(事实上 HTTP 2 已经变得普遍,但 1.1 仍然很常见)。
HTTP 1.1 请求包含 Host: 标头,允许浏览器指定其尝试访问的域。
您可以使用curl轻松地看到这一点,使用详细标志来查看您发送的请求:
# curl -Iv http://google.com/
* Trying 2a00:1450:4025:402::64:80...
* TCP_NODELAY set
* Connected to google.com (2a00:1450:4025:402::64) port 80 (#0)
> HEAD / HTTP/1.1
> Host: google.com
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 301 Moved Permanently
迁移到加密网站(HTTPS,使用 SSL/TLS)使事情变得复杂,因为加密握手必须在发送 HTTP 其余部分(包括 Host: 标头)之前发生,但从同一 IP 托管的多个站点可能使用不同的加密证书。
当前的解决方案是 SNI(服务器名称指示),它是 TLS 的扩展,在概念上类似于主机标头:请求浏览器在连接尝试的早期将其尝试连接的域发送到服务器,以便服务器可以正确完成加密握手。
答案2
在基于名称的虚拟主机上,Apache 使用服务器名称和服务器别名指令在匹配 IP 地址和端口后将 HTTP 请求的Host
标头与指定的域名进行匹配。
如果没有ServerName
/ServerAlias
匹配,则第一个列出的(默认)与 IP 地址和端口匹配的虚拟主机将收到请求。
有关的:
- 基于名称的虚拟主机支持(阿帕奇文档)