Is this the version you want? For more recent versions, check our documentation index.
この文書では名前ベースのバーチャルホストをどんなとき、 またどうやって使うのかということを説明します。
参考: 標準的なセットアップでの バーチャルホストの例、 IP ベースの バーチャルホストのサポート、 バーチャルホストのマッチングの具体的な詳細 と 大量のバーチャルホストを動的に設定する
初期のバージョンの HTTP では (他の多くのプロトコル、例えば FTP と同様) 一つのサーバ上でのバーチャルホストごとに異なった IP アドレスが必要でした。いくつかのプラットフォームでは、このことが 実行可能なバーチャルホストの数を限定してしまうことになりました。また、 IP アドレスの数には限りがあるということについての懸念から、レジストラ (ARIN, RIPE, APNIC) はバーチャルホストごとに IP を割り当てるようなことは避けるよう強く要請しています。
名前ベースのバーチャルホストは通常単純で、 それぞれのホスト名とそれに対応する正確な IP アドレスを DNS で設定し、異なるホスト名を区別出来るように Apache HTTP サーバを設定するだけです。さらに、名前ベースのバーチャルホストは不足する IP アドレスの需要を緩和します。したがって、IP ベースのバーチャルホストを選択すべき特定の理由がなければ名前ベースの バーチャルホストを使うべきです。 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 設定例