私はまた、apache2ダイナミックvhostフォールバックをググるこの質問に出くわし、Lucの回答は私の問題を解決するのに大いに役立ちましたが、主にいくつかの余分な作業が含まれていたため今後のGoogle社員に役立つかもしれません...
私の目標
- VPSを指すすべてのドメインとサブドメインの動的vhosting
foo.com 同じコンテンツを提供する必要があります www.foo.com
- 不明なドメインを何らかのデフォルトにフォールバック
foo.comtoの不明なサブドメインのフォールバックはwww.foo.com、wwwが利用できない場合を除き、代わりにデフォルトにフォールバックします
DNS
私のVPSを指すドメイン(およびそのすべてのサブドメイン)がいくつかあります。たとえば、
- foo.com
- bar.com
- foobar.com
ファイルシステム
次のディレクトリがあります。ドメインには、使用可能なサブドメインの名前のディレクトリが含まれます。wwwディレクトリが必要ですが、configはそれが存在しない状況に対応できるはずです。Localhostはデフォルトのフォールバックとして使用されます。
/var
/www
/localhost
/foo.com
/www
/bar
/bar.com
/foo
テスト
私の目標をテスト可能なケースに変換する:
- foo.comから提供されなければならないfoo.com/www
- www.foo.comから提供されなければならないfoo.com/www
- bar.foo.comから提供されなければならないfoo.com/bar
- foo.foo.comはから提供されなければならないfoo.com/www(foo.com/fooが存在しません)
- bar.comはlocalhostから提供する必要があります(bar.com/wwwは存在しません)
- www.bar.comはlocalhostから提供する必要があります(bar.com/wwwは存在しません)
- foo.bar.comから提供されなければならないbar.com/foo
- bar.bar.comはlocalhostから提供する必要があります(bar.com/barは存在しません)
- foobar.comはlocalhostから提供する必要があります(foobar.comは存在しません)
- www.foobar.comはlocalhostから提供する必要があります(foobar.comは存在しません)
- foo.foobar.comはlocalhostから提供する必要があります(foobar.comは存在しません)
ソリューション
これは使用します:mod_rewrite、mod_proxy_httpそしてもちろんmod_vhost_alias。
ServerName my.domain
ServerAdmin admin@my.domain
<VirtualHost *:80>
ServerName localhost
VirtualDocumentRoot /var/www/localhost
</VirtualHost>
<VirtualHost *:80>
ServerName sub.domain
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3 !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteCond /var/www/%2.%3/www !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
</VirtualHost>
<VirtualHost *:80>
ServerName bare.domain
ServerAlias *.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)$ [NC]
RewriteCond /var/www/%1.%2 !-d [OR]
RewriteCond /var/www/%1.%2/www !-d
RewriteRule (.*) http://localhost/$1 [P]
</VirtualHost>
これはどのように作動しますか?3つの仮想ホストが定義されています。
ローカルホスト
localhostがデフォルトとして機能します。解決できないすべての要求は、localhostによって処理されます。localhostから任意のドメインへのシンボリックリンクを設定することは、そのサイトをデフォルトとして設定することに似ています。
sub.domain
sub.domain vhostは、すべてのリクエストをの形式で受け取ります*.*.*。デフォルトでは、すべてのリクエストはの/domain.com/sub定義に従って提供されVirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3ます。
後退する:
1つ目RewriteRuleは不明なドメインを処理します。domain.comlocalhostウェブサイトをプロキシすることにより、ディレクトリが存在しません。
2つ目RewriteRuleも、domain.com/subとdomain.com/wwwディレクトリの両方が存在しない場合、localhostにプロキシします。
存在しない場合の3番目のRewriteRuleプロキシ。2番目の書き換えブロックのために存在することはわかっています。domain.comdomain.com/subdomain.com/www
bare.domain
bare.domain vhostが*.*リクエストを受け取って処理します/domain.com/www
ここではRewriteRulelocalhostにするとき意志プロキシdomain.comまたはdomain.com/www存在しません。
^ $%。* !!!
私はいくつかのトラブルすべてのそれらのまわりで私の頭をラップだった$し、%中にサインをRewriteCondし、RewriteRule私はここでそれらについて説明しますので。
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
*中には、ServerAlias単にワイルドカードです。
- の
%nは、ドキュメント名の補間VirtualDocumentRootからのものです。
%n中には、第二RewriteCondの選択を参照して(.*)最初からRewriteCond例えば、。要求されたドメインの部分。
%n中には、RewriteRuleあまりにも行います。
- の
$1は、の最初のRewriteRule選択(.*)を指しRewriteRuleます。ドメインから?リクエストURL までのすべてをキャプチャします。クエリ文字列はによって自動的にURLに追加されmod_proxyます。