mod_rewrite でサブドメインを無制限に作る

こんにちは。 今日は祝日で休みだぜぃ!ということで浮かれ気味です。

さて、僕は Xrea サーバー広告費非表示プランでサイトを公開しているのですが、ここのドメイン設定上限が20件 [1] 。 1サービスごとにサブドメインの設定してったら@もあるしサービス19までしか公開できないじゃん。 しかも他にもドメインもあるからもっと少ない。 Xrea の Main は blank にしたいし…。 もう1本契約するのは経済的に痛いし。。。

そこでふと浅はかな考えが浮かんだんです。

あれ? * (ワイルドカード| Xrea では default ) でサブドメイン一手に引き受けて mod_rewrite で振り分けちゃえばサブドメインいくら設定しても @ と * の2つで OK なんじゃね。 いぇい。 やったね。

はい。 これごとき結構簡単にできるだろうと思っていましたが甘かったようです。 500や502、多重リダイレクトで Chrome に接続止められたり。

ウェブ上探し回ったら僕と同じような考えをする人がいるみたいで、いくつかの情報はありましたが僕の環境ではことごとくエラー。

ほとほと困り果てていたところに mod_rewriteでのサブドメインについての #3196 の回答を見つけてこれを参考に設定してみたらやっと通りました。 2,3時間格闘していたのかな。

そして以下が苦労の果てに書いた .htaccess 。

RewriteEngine On
RewriteBase /
#運用しているサブドメインの場合
RewriteCond %{HTTP_HOST} ^([^.]+)\.ysd95\.be$ [NC]
RewriteCond %{DOCUMENT_ROOT}/domains/%1 -d
RewriteCond %{REQUEST_URI} !^/domains [NC]
RewriteRule ^(.*)$ /domains/%1/$1 [L]
#運用していないサブドメインの場合
RewriteCond %{HTTP_HOST} ^([^.]+)\.ysd95\.be$ [NC]
RewriteCond %{DOCUMENT_ROOT}/domains/%1 !-d
RewriteCond %{REQUEST_URI} !^/domains [NC]
RewriteRule ^(.*)$ http://yosida95.com/works.py?%{HTTP_HOST} [L,R=302]
-default.ysd95.be
|-domains
 |-hoge
  |-index.html

これで OK です。 これで、 domains 以下においた . を含まないディレクトリ名をそのまま ysd95.be のサブドメインとして扱う事ができます。

したがって domains の下にある hoge ディレクトリをそのまま http://hoge.ysd95.be/ として表示することができるのです。 これならディレクトリを増やすだけで無制限 [2] にサブドメインをつくっていくことができます。 Xrea のサブドメイン数制限 [1] なんてどこ吹く風です。

ついでに、参考にしたページではうけ先のディレクトリが存在しなくても割降っていましたので想定されていないサブドメインにアクセスされると403を返すと思いますので、 -d でディレクトリが存在する場合だけ表示させ、そうでない場合(例えば http://hogehoge.ysd95.be )は http://yosida95.com/works.py?hogehoge.ysd95.be に302 [3] で転送するようにしてあります。 こうすることで yosida95.com/works.py のログの解析でどのサブドメインに来られたのかトラッキングすることが可能であります。

[1](1, 2) 先ほど Xrea サーバーの仕様みてたら、足りない場合は相談に応じます、的なことが書いてありました。
[2]Linux でファイルシステム ext3 だと作れるディレクトリ数の上限は 32,000 だそうです。
[3]302なのは、もしかすると今後使用するかもしれないディレクトリについても301返してたら SEO 的に不利なのかもしれん、という事を考えたから。