私はまた、apache2ダイナミックvhostフォールバックをググるこの質問に出くわし、Lucの回答は私の問題を解決するのに大いに役立ちましたが、主にいくつかの余分な作業が含まれていたため今後のGoogle社員に役立つかもしれません...
私の目標
- VPSを指すすべてのドメインとサブドメインの動的vhosting
foo.com
同じコンテンツを提供する必要があります www.foo.com
- 不明なドメインを何らかのデフォルトにフォールバック
foo.com
toの不明なサブドメインのフォールバックは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.com
localhostウェブサイトをプロキシすることにより、ディレクトリが存在しません。
2つ目RewriteRule
も、domain.com/sub
とdomain.com/www
ディレクトリの両方が存在しない場合、localhostにプロキシします。
存在しない場合の3番目のRewriteRule
プロキシ。2番目の書き換えブロックのために存在することはわかっています。domain.com
domain.com/sub
domain.com/www
bare.domain
bare.domain vhostが*.*
リクエストを受け取って処理します/domain.com/www
ここではRewriteRule
localhostにするとき意志プロキシ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
ます。