apacheで複数のドメインを作成する方法

SeesaaやFC2など無料ブログサイトでは、ユーザーがサイトのドメインに乗っかったサブドメインを利用できるところがある。URLではusername01.example.comといった感じになる。数が限られているならVirtualHostの設定をしてもいいが、無料ブログサイトなどは頻繁に新しいサブドメインが作られる。いったいどんな仕掛けなんだ?

最初にDNS(bind9)の設定

ともかく名前解決ができなくては話にならない。名前解決できなければブラウザが「サーバが見つかんねーよ(意訳)」と言って、肝心のウェブサーバにアクセスさえしてくれないからね。どんなサブドメインでもIPアドレス(かCNAME)を返すようにしなくてはいけない。

これでどーだ。

$ORIGIN blog.example.com.
 *     A    192.168.0.10

これでabc.blog.example.comみたいなblog.example.comの配下のサブドメインは全て192.168.0.10で名前解決するようになった。

この手法は海外のレジストラでよく使っているみたいだね。ブラウザにドメインを間違えて入力すると、入力したドメインを「10ドルくらいでで売ってるよー」みたいな余計なお世話ページに誘導される。

で、これからapacheの設定になる。

mod_vhost_aliasでローカルのディレクトリにマッピングする方法

この方法はもっとシンプルで理解しやすいと思う。今回の目的のためにあるようなモジュールだから。

mod_vhost_aliasに答えがある。

UseCanonicalName Off
VirtualDocumentRoot /home/blog.example.com/%1

%1がホスト名で、動的に変更されるDocumentoRootになる。FQDNにしたいときには%0。ドメインとディレクトリをどう対応づけるかは、とても柔軟にできる。/home/com/example/blog/としたければ/home/%4/%3/%2/%1とする。

mod_rewriteでローカルのディレクトリにマッピングする方法

A Users Guide to URL Rewriting with the Apache Webserverにズバリ例があるんだ。Virtual User Hostがそれで、前述のblog.example.comにあわせると以下のようになる。

1 RewriteEngine on
2 RewriteCond  %{HTTP_HOST}  ^[^.]+\.blog\.example\.com$
3 RewriteRule  ^/icons/      - [PT]
4 RewriteRule  ^(.+)         %{HTTP_HOST}$1  [C]
5 RewriteRule  ^([^.]+)\.blog\.example\.com(.*) /home/blog.example.com/$1$2

2行目はblog.example.com以外のドメインで反応しないようにするため。4行目でHTTP_HOSTをリクエストにつなげている。5行目でホスト名を元に適当なディレクトリに振り分ける。3行目はApacheのiconsディレクトリがAlias設定になっているのを、mod_rewriteで処理しなでmod_aliasに渡すようにするもので、なくても問題はない。

mod_rewriteも正規表現を利用してドメインとディレクトリの対応はとても柔軟にできる。

mod_rewriteで自サーバのURLにマッピングする方法

ローカルのファイルシステムにマッピングする方法だと、アプリケーションもそれぞれのディレクトリに配置する必要がある。それより全ユーザーが共通のアプリを使ったほうが効率がいい。もちろんアプリがちゃんと対応できるような仕掛けになっていることが前提になる。

1 RewriteEngine on
2 RewriteCond  %{HTTP_HOST}  ^[^.]+\.blog\.example\.com$
3 RewriteRule  ^/icons/      - [PT]
4 RewriteRule  ^(.+)         %{HTTP_HOST}$1  [C]
5 RewriteRule  ^([^.]+)\.blog\.example\.com(.*) /blogapp/$1$2

違いは5行目だけ。mod_rewriteがDocumentRootとあわせてたディレクトリが存在するので、URLなのだと判断するって仕掛け。なんだけど、うーんこれって、わかりにくいなあ。同じことは下記でもできるので、そっちを検討してもいいかもしれない。

mod_rewrite + mod_proxyで別のサーバにマッピングする方法

ZOPEとかlighttpdとかTomcatとかバックエンドサーバがある場合。mod_rewriteにmod_proxyを組みあわせて動的なリバースプロキシにする。

1 RewriteEngine on
2 RewriteCond  %{HTTP_HOST}  ^[^.]+\.blog\.example\.com$
3 RewriteRule  ^(.+)         %{HTTP_HOST}$1  [C]
4 RewriteRule  ^([^.]+)\.blog\.example\.com(.*) http://blogapp.example.com/$1$2

Tomcatはajpにするのもありかと。

これだけだとうまく動かないアプリケーションもあるかもしれない。例えばバックエンドサーバが出力するCookieがバックエンドのFQDNのため、Cookieによるセッションが確立しないとか。そういうときにはProxyPassReverseCookieDomainとかmod_proxyの機能で調整する必要がある。

これで、めでたしめでたし、になるはず。