任意のサブドメインを受け付けるサイトをつくりたかった。どういうことかというと、
“example.jp”
というドメインを所有しているとして、その任意のサブドメイン、例えば、
“test.example.jp”
“テスト.example.jp”
でもアクセスできる様にし、そのサブドメインの内容によって動的に表示する内容を変更したかった。
これは要するに、
- 任意のサブドメインからアクセスできる
- アクセスされたホスト名を取得する
ことが必要らしい。
あまり詳しくないので以下こうしたらとりあえず動くようになったというメモである。不適切な部分があるかもしれない。
任意のサブドメインからアクセスできる
次のページを元に設定を行った。
これは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 に導かれるようになる。
アクセスされたホスト名を取得する
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
で取得できる。