にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

任意のサブドメインを受け付けるサイト

任意のサブドメインを受け付けるサイトをつくりたかった。どういうことかというと、

“example.jp”

というドメインを所有しているとして、その任意のサブドメイン、例えば、

“test.example.jp”
“テスト.example.jp”

でもアクセスできる様にし、そのサブドメインの内容によって動的に表示する内容を変更したかった。

これは要するに、

  1. 任意のサブドメインからアクセスできる
  2. アクセスされたホスト名を取得する

ことが必要らしい。


あまり詳しくないので以下こうしたらとりあえず動くようになったというメモである。不適切な部分があるかもしれない。

任意のサブドメインからアクセスできる

次のページを元に設定を行った。

これはDNSの設定になる。
DNSサーバがワイルドカードに対応してない場合、別のDNSサーバを使う必要があるとのこと。

ゴンベイドメインの無料DNSサービスでは次の様に設定する。
ZONEファイル設定で、

ホスト名 タイプ データ
* A IPv4 Address
@ A IPv4 Address

などとする。

* の部分が hoge.example.jp 等でアクセスされるサーバ、
@ の部分が example.jp でアクセスされるサーバの設定になる。
また、 IPv6 のアドレスを設定する場合はタイプをAAAAにする。

この設定で、サブドメイン部分に . を含む hoge.moge.example.jp の様なホスト名でもアクセスできるようである。


さらに、Apacheの設定をする。(同じDocumentRootにする場合はVirtualHostの設定は不要かもしれない。サブドメインによってDocumentRoot分けるためには必要になってくるはず)
/etc/httpd/conf/httpd.conf (CentOS 6の場合)を編集し、

#コメントアウト
NameVirtualHost *:80

#追記
<VirtualHost *:80>
    ServerAdmin example.jp
    ServerName example.jp
    ServerAlias *.example.jp example.jp
    DocumentRoot /var/www/html/
    ErrorLog logs/error_log
    CustomLog logs/access_log common
</VirtualHost>

にすると *.example.jp でアクセスすると(ついでに example.jp も)全て同じ DocumentRoot に導かれるようになる。

アクセスされたホスト名を取得する

CGIからは環境変数で取得できる。

Pythonでは、アクセスされたホスト名は

import os

hostname = os.environ.get("HTTP_HOST", "<none>")
#あるいは os.environ["HTTP_HOST"] とか

等で取得できる。

また、 Punycodeエンコードされた国際化ドメイン名は、次の様にすることでUnicode文字列へデコードできる。

import codecs

host_decode = codecs.decode(hostname, 'idna')

あるいは、サーバサイドでなくても、Javascriptから

host = location.hostname

で取得できる。