バーチャルホスト 名前ベースのバーチャルホスト

この文書では名前ベースのバーチャルホストをどんなとき、 どうやって使うかを説明します。

ネームベースのバーチャルホスト バーチャルホストのマッチングについての詳細 大量のバーチャルホストの動的な設定 バーチャルホストの一般的な設定例 ServerPath 設定例
名前ベースと IP ベースのバーチャルホストの比較

IP ベースのバーチャルホストでは、応答する バーチャルホストへのコネクションを決定するために IP アドレスを使用します。ですから、それぞれのホストに個々に IP アドレスが必要になります。これに対して名前ベースのバーチャルホストでは、 クライアントが HTTP ヘッダの一部としてホスト名を告げる、 ということに依存します。この技術で同一 IP アドレスを異なる多数のホストで共有しています。

名前ベースのバーチャルホストは通常単純で、それぞれのホスト名と それに対応する正確な IP アドレスを DNS で設定し、異なる ホスト名を区別するように Apache HTTP サーバを設定するだけです。 さらに、名前ベースのバーチャルホストは不足する IP アドレスの需要を緩和します。したがって、IP ベースのバーチャルホストを 選択すべき特定の理由がなければ名前ベースのバーチャルホストを使うべきです。 IP ベースのバーチャルホストを使用することを考慮する理由として、

名前ベースのバーチャルホストを利用する core DocumentRoot NameVirtualHost ServerAlias ServerName ServerPath VirtualHost VirtualHost

名前ベースのバーチャルホストを使うには、そのホストへの リクエストを受け付けるサーバの IP アドレス (もしかしたらポートも) を指定する必要があります。 これは NameVirtualHost ディレクティブで設定します。通常、NameVirtualHost* の属性を使ってサーバの全ての IP アドレスを使います。 (例えば SSL の使用などで) 複数のポートを使うことを計画しているのであれば、 引数に *:80 のようにポートも含めるようにしてください。 NameVirtualHost ディレクティブで IP アドレスを書いても、 自動的にサーバがその IP アドレスをリッスンするということはないことに 注意してください。詳細は「Apache の使うアドレスと ポートを設定する」を読んでください。さらに、ここで指定された IP アドレスは全てサーバのネットワークインターフェースと関連付けられて いなければなりません。

次は、扱うホストそれぞれに対して VirtualHost ブロックを 作成してください。VirtualHost ディレクティブの引数は NameVirtualHost ディレクティブの引数と同じにしてください (すなわち、IP アドレスか、全てのアドレスを意味する *)。それぞれの VirtualHost ディレクティブの中には、最低限、どのホストが扱われるかを示す ServerName ディレクティブと、 そのホスト用のコンテンツがファイルシステム上のどこにあるかを示す DocumentRoot ディレクティブを 書く必要があります。

メインホストはなくなります

既にあるウェブサーバにバーチャルホストを追加する場合、 既存のウェブサーバに対しても VirtualHost ブロックを作らなければなりません。このバーチャルホストの ServerNameDocumentRoot は、グローバルな ServerNameDocumentRoot と同じものにします。また、このバーチャルホストを設定ファイルの中で 先頭に置いて、デフォルトホストとして動作するようにします。

たとえば、www.domain.tld を動かしていて、 さらにバーチャルホスト www.otherdomain.tld を追加するとしましょう。このバーチャルホストは同一 IP を指しているとします。 そのような場合は、httpd.conf に以下のようなコードを追加するだけです

NameVirtualHost *:80

<VirtualHost *:80>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
</VirtualHost>

<VirtualHost *:80>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain
</VirtualHost>

NameVirtualHost 及び VirtualHost のどちらの場合も、 * の部分には明示的に IP アドレスを指定することができます。 例えば、ある IP アドレスでは名前ベースのバーチャルホストを使いたい一方で、 別の IP アドレスでは、他の IP ベースのバーチャルホストや 別組の名前ベースのバーチャルホストを使いたい場合、 そう設定することになるでしょう。

複数の名前でサーバアクセスができるようにしたいことも多いでしょう。 このようなことは、ServerAlias ディレクティブを VirtualHost セクションに記述することで実現できます。 例えば上記の VirtualHost の例であれば、 次のように一覧に挙げられた名前が、 ユーザが同一のウェブサイトとして目にして使用できるサーバ名である、 と ServerAlias ディレクティブで指定できます。

ServerAlias domain.tld *.domain.tld

domain.tld ドメインへの全てのホストへのリクエストは www.domain.tld のバーチャルホストが処理します。 名前をマッチさせるために、ワイルドカード文字 * や ? を使用することもできます。もちろん思いつきの名前を作って、 ServerNameServerAlias にその名前を書くといったことはできません。まずは、 これらの名前が サーバに付けられた IP アドレスにマップされるように DNS サーバを適切に設定しなければなりません。

最後に、VirtualHost コンテナの中に 他のディレクティブを書くことで、バーチャルホストの設定を細かく調整 することができます。 ほとんどのディレクティブはこれらのコンテナに設置することができて、 変更点はそのバーチャルホストに対してのみ有効になります。 どのディレクティブを書くことができるかは、ディレクティブの コンテキスト を 調べてください。主サーバコンテキスト (VirtualHost コンテナの外) の設定用ディレクティブはバーチャルホストでの設定で 上書きされない場合のみ使用されます。

リクエストが来ると、サーバはまず最初に NameVirtualHost にマッチする IP アドレスかどうかをチェックします。マッチすれば マッチした IP アドレスの VirtualHost のそれぞれのセクションの中から ServerNameServerAlias に要求されたホスト名があるか探します。 見つかればそのサーバ用の設定を使います。マッチするバーチャルホスト が見つからなければ、マッチした IP アドレスの リストの最初にあるバーチャルホスト が使われます。

結果として、リストの最初のバーチャルホストが デフォルト の バーチャルホストになります。IP アドレスが NameVirtualHost ディレクティブにマッチした場合は、メインのサーバDocumentRoot決して使われません どのバーチャルホストにもマッチしないリクエストに対して、 特別な設定をしたいのであれば、設定ファイル中の最初の <VirtualHost> コンテナにそれを記述してください。

古いブラウザとの互換性

以前述べたように、名前ベースのバーチャルホストが正しく動作する ために必要な情報を送ってこないクライアントが依然として存在しています。 そのようなクライアントに対しては、該当する IP アドレスについて、 一番最初に設定されているバーチャルホスト (プライマリの名前ベースのバーチャルホスト) からページが送り返されます。

どのぐらい古いの ?

「古い」と表現している場合、本当に古いことを意味して使っています。 不幸にして今現在でもこのような古いブラウザに遭遇することがあります。 現在のブラウザは全て、名前ベースのバーチャルホストに必要な Host ヘッダを送ります。

ServerPath ディレクティブで対処が可能です。ちょっと不格好ですけれども。

設定例

NameVirtualHost 111.22.33.44

<VirtualHost 111.22.33.44>
ServerName www.domain.tld
ServerPath /domain
DocumentRoot /web/domain
</VirtualHost>

この例にはどういう意味があるでしょうか? これは "/domain" で始まる URI へのリクエストはすべて、 バーチャルホスト www.domain.tld で処理される、 という意味です。つまり、すべてのクライアントで http://www.domain.tld/domain/ でアクセスできるページが、 Host: ヘッダを送ってくるクライアントであれば http://www.domain.tld/ としてもアクセスできる、 という意味です。

これが動作するようにするには、 プライマリのバーチャルホストのページに http://www.domain.tld/domain/ へのリンクを設置します。 そして、バーチャルホストのページでは、純粋な相対リンク (例: "file.html" や "../icons/image.gif")、 あるいは /domain/ で始まるリンク (例: "http://www.domain.tld/domain/misc/file.html" や "/domain/misc/file.html") だけを設置します。

これには、幾分かの規律が必要となりますが、 このようなガイドラインを忠実に守ることにより、たいていの場合、 すべてのブラウザで ― 新しいブラウザでも古いものでも ― 作成したページが見えるということを保証します。