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

### Apache HTTP Server Version 1.3

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

- 名前ベース と IP-based のバーチャルホストの比較
- 名前ベースのバーチャルホストを利用する
- 古いブラウザとの互換性

参考: 標準的なセットアップでの バーチャルホストの例、 IP ベースの バーチャルホストのサポート、 バーチャルホストのマッチングの具体的な詳細 と 大量のバーチャルホストを動的に設定する

## 名前ベースと IP ベースのバーチャルホストの比較

初期のバージョンの HTTP では (他の多くのプロトコル、例えば FTP と同様) 一つのサーバ上でのバーチャルホストごとに異なった IP アドレスが必要でした。いくつかのプラットフォームでは、このことが 実行可能なバーチャルホストの数を限定してしまうことになりました。また、 IP アドレスの数には限りがあるということについての懸念から、レジストラ (ARIN, RIPE, APNIC) はバーチャルホストごとに IP を割り当てるようなことは避けるよう強く要請しています。

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

- 名前ベースのバーチャルホストに対応していない古いクライアントがある 名前ベースのバーチャルホストが働くためには、クライアントは HTTP ホストヘッダを送ってこなければなりません。 これは HTTP/1.1 の仕様で要求されていて、すべての現代的な HTTP/1.0 ブラウザでも拡張として実装されています。 とても古いクライアントをサポートしつつ、名前ベースの バーチャルホストを行いたい場合は、この文書の最後の方に 書かれている解決策になるかもしれない方法を見てください。
- 名前ベースのバーチャルホストは SSL プロトコルの特徴により、 SSL セキュアサーバには使えません。
- オペレーティングシステムやネットワーク装置のなかには、別の IP アドレス上でない場合、複数のホストを別扱いできないような 帯域管理の方法を実装しているものがあります。

## 名前ベースのバーチャルホストを利用する

関連ディレクティブ DocumentRoot NameVirtualHost ServerAlias ServerName ServerPath VirtualHost

名前ベースのバーチャルホストを使うには、そのホストへの リクエストを受け付けるサーバの IP アドレス (もしかしたらポートも) を指定する必要があります。 これは NameVirtualHost ディレクティブで設定します。通常、`NameVirtualHost` で `*` の属性を使ってサーバのすべての IP アドレスを使います。 (`NameVirtualHost *` はバージョン 1.3.13 以降のみで動作します。) `NameVirtualHost` ディレクティブで IP アドレスを書いても、 自動的にサーバがその IP アドレスをリッスンするということはないことに 注意してください。詳細は Apache の使うアドレスと ポートを設定する を読んでください。さらに、ここで指定された IP アドレスはすべてサーバのネットワークインターフェースと関連付けられて いなければなりません。

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

既に存在するウェブサーバにバーチャルホストを追加する場合、 存在するホスト用の <VirtualHost> ブロックを作らなければなりません。 `ServerName` と `DocumentRoot` はこのバーチャルホストも含めて、それぞれグローバルな `ServerName` 及び `DocumentRoot` と同じものにするべきです。設定ファイル中で最初に記述した このバーチャルホストは デフォルトのバーチャルホストとしても振る舞います。

例えば、ドメイン `www.domain.tld` を運用しているところに バーチャルホスト `www.otherdomain.tld` を追加する場合で、 両方が同じ IP アドレスを指しているとします。そのような場合は、 `httpd.conf` に以下のようなコードを追加するだけです

        NameVirtualHost *

        <VirtualHost *>
        ServerName www.domain.tld
        DocumentRoot /www/domain
        </VirtualHost>

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

`NameVirtualHost` 及び `<VirtualHost>` のどちらの場合も、 * の部分には明示的に IP アドレスを指定することができます。 バージョン 1.3.12 以前では IP アドレスの指定が必要でした。

複数の名前でサーバアクセスができるようにしたいことも多いでしょう。 このようなことは、`ServerAlias` ディレクティブを <VirtualHost> セクションに記述することで実現できます。 例えばこれを最初の <VirtualHost> ブロックに書き加えると、

        ServerAlias domain.tld *.domain.tld

`domain.tld` ドメインへのすべてのホストへのリクエストは `www.domain.tld` のバーチャルホストが処理します。 * や ? をワイルドカード文字として使用できますが、当然ながらそれだけで `ServerName` や `ServerAlias` の名前や場所を構成することはできません。まず最初に DNS のホスト名と IP アドレスをサーバにあわせて適切に設定する事が必要です

最後に、`<VirtualHost>` コンテナの中に 他のディレクティブを書くことで、バーチャルホストの設定を細かく変更 することができます。どのディレクティブを書くことができるかは、 ディレクティブの コンテキスト を 調べてください。主サーバコンテキスト (`<VirtualHost>` コンテナの外) の 設定用ディレクティブはバーチャルホストでの設定で上書きされていない ときのみ使用されます。

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

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

## 古いブラウザとの互換性

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

`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`") だけを設置します。

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

参考: ServerPath 設定例

### Apache HTTP Server Version 1.3