Apache-Httpd
Apache 網路伺服器如何檢測 CNAME
我很好奇即使所有子域都指向同一個 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
確實,在網路的早期,通過一個 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 的擴展,在概念上類似於 Host 標頭:請求瀏覽器在連接嘗試的早期將它嘗試連接的域發送到伺服器,以便伺服器可以正確完成加密握手。