|
サーバコンフィギュレーション:
...
Port 80
DocumentRoot /www/domain
ServerName www.domain.tld
<VirtualHost 111.22.33.55>
DocumentRoot /www/otherdomain
ServerName www.otherdomain.tld
...
</VirtualHost>
www.otherdomain.tld はアドレス 111.22.33.55 を通じてつながる一方、www.domain.tld は 111.22.33.44 (メインサーバ) を通じてつながります。
サーバコンフィギュレーション:
...
Port 80
ServerName server.domain.tld
<VirtualHost 111.22.33.44>
DocumentRoot /www/domain
ServerName www.domain.tld
...
</VirtualHost>
<VirtualHost 111.22.33.55>
DocumentRoot /www/otherdomain
ServerName www.otherdomain.tld
...
</VirtualHost>
メインサーバは決してリクエストを受け取りません。なぜなら、マシンにある全ての IP アドレスは IP-based のバーチャルホストのために使用中だからです(localhost リクエストはメインサーバをヒットすることができます)
サーバコンフィギュレーション:
...
Port 80
Listen 111.22.33.44:80
Listen 111.22.33.55:8080
ServerName server.domain.tld
<VirtualHost 111.22.33.44:80>
DocumentRoot /www/domain
ServerName www.domain.tld
...
</VirtualHost>
<VirtualHost 111.22.33.55:8080>
ServerName www-cache.domain.tld
...
<Directory proxy:>
order deny,allow
deny from all
allow from 111.22.33
</Directory>
</VirtualHost>
メインサーバは決してリクエストを受け取りません。なぜなら、マシンの全ての IP アドレス (localhost から離れたもの) は IP-based のバーチャルホストで使われているからです。ウェブサーバはポート 80 を通した最初のアドレスと ポート 8080 を通した2番目のアドレスのプロキシーだけがつながります。
サーバコンフィギュレーション:
...
Port 80
ServerName server.domain.tld
NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
DocumentRoot /www/domain
ServerName www.domain.tld
...
</VirtualHost>
<VirtualHost 111.22.33.44>
DocumentRoot /www/subdomain
ServerName www.sub.domain.tld
...
</VirtualHost>
localhost は別にして、指定された addresses/ports があり、メインサーバだけが localhost のリクエストを受け取ります。www.domain.tld が最も高い優先度を持っているせいで、default や primary のサーバとしては見られません。
サーバコンフィギュレーション:
... Port 80 ServerName www.domain.tld DocumentRoot /www/domain NameVirtualHost 111.22.33.55 <VirtualHost 111.22.33.55> DocumentRoot /www/otherdomain ServerName www.otherdomain.tld ... </VirtualHost> <VirtualHost 111.22.33.55> DocumentRoot /www/subdomain ServerName www.sub.domain.tld ServerAlias *.sub.domain.tld ... </VirtualHost>111.22.33.55 以外のアドレスに対するリクエストは、メインサーバから与えられます。Host:が知られていないか、あるいは存在しない 111.22.33.55 へのリクエストは、www.otherdomain.tld から与えられます。
サーバコンフィギュレーション:
...
Port 80
ServerName server.domain.tld
NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
DocumentRoot /www/domain
ServerName www.domain.tld
...
</VirtualHost>
<VirtualHost 111.22.33.44>
DocumentRoot /www/subdomain1
ServerName www.sub1.domain.tld
...
</VirtualHost>
<VirtualHost 111.22.33.44>
DocumentRoot /www/subdomain2
ServerName www.sub2.domain.tld
...
</VirtualHost>
<VirtualHost 111.22.33.55>
DocumentRoot /www/otherdomain1
ServerName www.otherdomain1.tld
...
</VirtualHost>
<VirtualHost 111.22.33.66>
DocumentRoot /www/otherdomain2
ServerName www.otherdomain2.tld
...
</VirtualHost>
サーバコンフィギュレーション:
...
Listen 80
Listen 8080
ServerName www.domain.tld
DocumentRoot /www/domain
<VirtualHost 111.22.33.44:8080>
DocumentRoot /www/domain2
...
</VirtualHost>
ポート 80 で www.domain.tld に対するリクエストはメインサーバから与えられ、ポート 8080 へのリクエストは、バーチャルホストから与えられます。
_default_ を使ったバーチャルホストサーバコンフィギュレーション:
... <VirtualHost _default_:*> DocumentRoot /www/default ... </VirtualHost>実際にワイルドカードのポートでデフォルトのバーチャルホストを使うと、リクエストがメインサーバへ向かうのを妨げます。
デフォルトのバーチャルホストは、name-based のバーチャルホストのために使われる address/port を送信されたリクエストを決して与えません。もしリクエストが、知られていないか、存在しないHost:ヘッダを含んでいれば、常に最初の name-based のバーチャルホストから与えられます(コンフィギュレーションファイルで最初に現れる address/port のためのバーチャルホスト)。
単一のインフォメーションページ(またはスクリプト)に対するリクエストを書き換えるために、AliasMatchかRewriteRuleを使うことができます。
_default_ のバーチャルホストを使いたいのです。
サーバコンフィギュレーション:
...
<VirtualHost _default_:80>
DocumentRoot /www/default80
...
</VirtualHost>
<VirtualHost _default_:*>
DocumentRoot /www/default
...
</VirtualHost>
ポート 80 (ワイルドカードのポートでデフォルトのバーチャルホストの前になければならない)のデフォルトのバーチャルホストは、指定されていない IP アドレスに送信される全てのリクエストを捕らえます。メインサーバはリクエストを与えるためには決して使われません。
サーバコンフィギュレーション:
...
<VirtualHost _default_:80>
DocumentRoot /www/default
...
</VirtualHost>
ポート 80 で、指定されていないアドレスへのリクエストは、指定されていないアドレスへのデフォルトのバーチャルホストのなんらかのリクエストから与えられます。
VirtualHost 命令に新しい IP アドレス(111.22.33.66)を追加することができるからです。
サーバコンフィギュレーション:
...
Port 80
ServerName www.domain.tld
DocumentRoot /www/domain
NameVirtualHost 111.22.33.55
<VirtualHost 111.22.33.55 111.22.33.66>
DocumentRoot /www/otherdomain
ServerName www.otherdomain.tld
...
</VirtualHost>
<VirtualHost 111.22.33.55>
DocumentRoot /www/subdomain
ServerName www.sub.domain.tld
ServerAlias *.sub.domain.tld
...
</VirtualHost>
バーチャルホストは新しいアドレス(IP-based のバーチャルホストとして)と古いアドレス(name-based のバーチャルホストとして)を通してアクセスされます。
ServerPath 命令の使用Host: ヘッダを送信しなければなりません。古い HTTP/1.0 クライアントはそのようなヘッダを送信せず、Apache にはクライアントが行こうとしているバーチャルホストの手がかりがありません(そして最初のバーチャルホストからのリクエストを与えます)。可能な限りの互換性を提供するために、name-based のバーチャルホストに対する URL prefix とのリンクを含んだ単独のページを実行する、第一のバーチャルホストを作ります。
サーバコンフィギュレーション:
... NameVirtualHost 111.22.33.44 <VirtualHost 111.22.33.44> # primary vhost DocumentRoot /www/subdomain RewriteEngine On RewriteRule ^/.* /www/subdomain/index.html ... </VirtualHost> <VirtualHost 111.22.33.44> DocumentRoot /www/subdomain/sub1 ServerName www.sub1.domain.tld ServerPath /sub1/ RewriteEngine On RewriteRule ^(/sub1/.*) /www/subdomain$1 ... </VirtualHost> <VirtualHost 111.22.33.44> DocumentRoot /www/subdomain/sub2 ServerName www.sub2.domain.tld ServerPath /sub2/ RewriteEngine On RewriteRule ^(/sub2/.*) /www/subdomain$1 ... </VirtualHost>ServerPath命令のせいで、URL http://www.sub1.domain.tld/sub1/ に対するリクエストは sub1-vhost から常に与えられます。
URL http://www.sub1.domain.tld/ に対するリクエストは、クライアントが正しいHost:ヘッダを送信すれば、sub1-vhost からのみ与えられます。もしHost:ヘッダが送信されていなければ、クライアントは第一のホストからインフォメーションページを得ます。
一つの oddity があることに注意してください: http://www.sub2.domain.tld/sub1/ に対するリクエストは、もしクライアントがHost:ヘッダを送信していなければ、sub1-vhost から与えられます。
RewriteRule命令は、正確なHost:ヘッダを送信するクライアントが両方の URL の違い、すなわち URL prefix があるかないかを使っていることを確認するために使います。
The English original manual is here.