すべてのサブドメインが同じ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
実際、Webの初期には、単一のIPで複数のWebサイト(異なるドメイン、単一ドメインのサブドメインなど)をホストすることは不可能でした。
しかし、1999年からHTTP 1.1への移行が始まり、現在ではHTTP 1.0はほとんど使用されていません(実際、HTTP 2は一般化されていますが、1.1は依然として一般化されています)。
HTTP 1.1リクエストにはHost:ヘッダーが含まれており、ブラウザがアクセスするドメインを指定できます。
送信要求を表示するには、verboseフラグを使用してカールを使用してそれらを簡単に確認できます。
# 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
暗号化されたサイト(SSL / TLSを使用するHTTPS)に移動すると、残りのHTTPが送信される前に暗号化されたハンドシェイクが発生する必要があるため、状況が複雑になります(Host:ヘッダーを含む)。ただし、同じIPでホストされている複数のサイトでは、異なる暗号化証明書を使用できます。
現在のソリューションは、ホストヘッダーの概念に似たTLS拡張であるServer Name Indication(SNI)です。つまり、接続試行の最初にサーバーに接続するドメインを送信するようブラウザに要求します。サーバーは暗号化されたハンドシェイクを正しく完了できます。
答え2
名前ベースの仮想ホストでは、Apache は以下を使用します。サーバー名そしてサーバーエイリアスディレクティブは、IPアドレスとポートを一致させた後、Host
HTTP要求のヘッダーを指定されたドメイン名と一致させます。
ServerName
一致するものがない場合は、ServerAlias
IPアドレスとポートと一致する最初のリストされた(デフォルト)仮想ホストが要求をリッスンします。
関連:
- 名前ベースの仮想ホストのサポート(Apacheドキュメント)