クライアントでサブドメイン

Trolley.Netではサブドメイン転送を多用しています。その舞台裏を紹介します。

通常サブドメインは,DNSで個別に定義します。たとえば,
www.trolley.net.   IN  A       192.168.1.2
kyoto.trolley.net.  IN  CNAME  www.trolley.net.
上の例のように1台のサーバで複数のサブドメインを処理する場合,apacheでは各々の(バーチャル)サブドメインの参照先を"httpd.conf"で指定してやる必要があります。通常このような処理は,サーバの管理者権限がなければ実行できません。

Trolley.Netでは,サブドメインの定義をクライアント側でJavaScriptを用いて実現しています。JavaScript関係のサイトを探しましたが,類似の例を発見することはできませんでした。従って,ここで紹介する方法は全くのオリジナルです。

DNSでは(余り使われませんが)ワイルドカードの指定が可能です。

*.trolley.net.   IN   A      192.168.1.2
さらに"httpd.conf"では,ServerAliasディレクティブを使ってTrolley.Netに対する全ての要求が特定のファイル(下の例では"forward.html")を指すようにします。
NameVirtualHost 192.168.1.2

<VirtualHost 192.168.1.2>
DocumentRoot /www/htdocs/trolley/
AliasMatch /.* "/www/htdocs/trolley/forward.html"
ServerName trolley.net
ServerAlias trolley.net *.trolley.net
ResourceConfig conf/srm.conf
</VirtualHost>
以上は自前のサーバを使用する場合に必要となる設定ですが,転送プロバイダを使用する場合は,プロバイダ側のサービス内容に依存します。Trolley.Netが使用している転送プロバイダでは,デフォルトのDNSはワイルドカード指定になっており,"httpd.conf"のServerAliasも指定されているため,ユーザ側では"httpd.conf"のターゲットとして特定ファイルを指定するだけで済みます。
#値段ばかり高くて,"www"しか転送してくれないプロバイダも多いので,契約時にはサービス内容の詳細を吟味する必要があります。

さて問題の"forward.html"の中身ですが,概ね以下のようになっています。

<SCRIPT LANGUAGE="JavaScript">
<!--
/* JavaScript subdomain forwarder program. (c)2002, Trolley.Net */
if(navigator.userAgent.indexOf('DoCoMo')>=0) {
location.replace("./i-mode.html"); //i-modeからのアクセスを別メニューに飛ばす。
}
dom="http://www.realsite.ne.jp/~user/trolley/"; //デフォルトの実サイトのディレクトリを指定。
str=document.referrer; //変数"str"には,このhtmlが何で呼ばれたかが入る。
idx=str.indexOf("trolley.net",7);
/* "7"は"http://"の文字数で,"str"の7文字め以降が"trolley.net"を含むことを確認。*/
if (idx < 0) { // Error trap when referrer is empty.
location.replace(dom); //誤ったアクセスの場合は,トップページを表示。
} else {
subd="";
path=str.substring(idx+12);
/* "trolley.net/"は12文字なので,"trolley.net"の開始位置から12文字め以降はディレクトリ/ファイル指定。*/
if (idx > 7) { //"trolley.net"の開始位置が7文字め以降ならサブドメイン指定がある。
subd=str.substring(7,idx-1); //サブドメインを切り取る。
path1= subd + "/" + path;
/* サブドメイン指定がある場合には,ディレクトリ/ファイル指定の前にサブドメイン名を追加した"path1"も定義する。*/
} }
/* 以下定義されているサブドメインごとに処理を指定する。*/
if (subd.match(/yamato/i)) {
loc="http://member.nifty.ne.jp/danjo/" + path; //別サイトの例:大和川電軌のサイトにディレクトリ/ファイル指定を引き渡す。
} else {
if (subd.match(/kyoto/i)) {
loc=dom + path1; //京都市電のページの場合は,サブドメイン名を挟んで実ページを指定。
} else {
loc=dom + path; //未定義のサブドメインの場合は,Trolley.Netのデフォルトページにディレクトリ/ファイル指定を引き渡す。
} }
location.replace(loc); //表示内容を上で指定した実ページ"loc"に置き換える。
// -->
</SCRIPT>
<NOSCRIPT>
/* JavaScriptを処理できないクライアントに対する処理を書く。*/
</NOSCRIPT>
これでクライアント側のJavaScriptで自由にサブドメインが作成できることになります。
#Trolley.Netではこの機能を利用して,サブドメイン転送サービスを提供しています。詳しくはこちら
(05/09/2002記)