エクスリア プラスや VALUE-SERVER.com のサブドメイン登録上限を突破する方法。
- DNS設定:サブドメインにワイルドカード
- サーバー設定:Catch Allと.htaccess で振分
DNS設定
DNS(Domain Name System)とは、ドメイン名(example.com)と数字で表されるIPアドレスを紐付けるもの。
サブドメインにワイルドカード(*)を使うとすべてのサブドメインが同一 IPアドレスにつながる。つまりサブドメイン毎にDNSを設定しなくとも、同じサーバーに飛ぶようにできる。
サーバー設定
Main を「blank」サブドメインを 「default」 と設定することでキャッチオール機能を使うとabc.example.com でも xyz.example.com でもすべて default.example.com にアクセスをまとめる事ができる。
そして .htaccess で
abc.example.com は default.example.com/abc/
xyz.example.com は default.example.com/xyz/
の内容を表示するように設定する。
.htaccess の例
# .htaccess でRewriteモジュールを有効化
RewriteEngine On
# URL書き換えのベースパスを指定するディレクトリ
RewriteBase /
# 無限ループ防止用。
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
# ホスト名が「サブドメイン.example.com」?
RewriteCond %{HTTP_HOST} ^(.+)\.example\.com$ [NC]
# 「ルート:default.example.com/サブドメイン」にディレクトリがある?
RewriteCond %{DOCUMENT_ROOT}/%1 -d
# パスを「サブドメイン/パス」に書き換え
RewriteRule ^(.*)$ %1/$1
「.htaccess」とは、アパッチ(Apache)を用いたwebサーバーでディレクトリ単位で設置できる設定ファイルのこと。PCRE(perl互換の正規表現)が使える。
先頭のドットは、Unix系の隠しファイルの意味。ウィンドウズのメモ帳でも「.htaccess」と名前を付けて保存することで作成できる。
正規表現とは、文字列の集合を一つの文字列で表現する方法。パターンマッチ検索で便利。
RewriteCond:書き換え条件を指定
書式: RewiteCond テスト文字列 条件パターン [オプション]
RewireRule:書き換えルールを定義
書式:RewiteRule パターン 代入値 [オプション]
代入値「-」:何も書き換えない。
環境変数: %{変数名}
- %{ENV:REDIRECT_STATUS}:リダイレクトステイタス。「200」は、ブラウザで正しくページ表示されたことを表す。
- %{HTTP_HOST}:ホスト名
- %{DOCUMENT_ROOT}:ドキュメントルートディレクトリ
- %{REQUEST_URI}:リクエストURL。パスとクエリ
後方参照
- %1:RewriteCond の () 内を後方参照。ここでは「サブドメイン」
- $1:RewriteRule の () 内を後方参照。ここでは「0回以上の任意の文字列」
条件パターン
- 「-d」:指定ディレクトリが存在すれば、true
オプション
- [NC]:nocase 判定パターンで大文字・小文字の区別をしない
- [L]:last 書き換え終了。これ以降のルール適用をしない。
peal互換の正規表現
メタ文字
- ^:先頭にマッチ
- $:末尾にマッチ
- .:改行を除く任意の一文字
- ():グループ化。後方参照で利用可能に
- *:直前の文字を0回以上マッチ
- +:直前の文字を1回以上マッチ
- \:バックスラッシュ。直後の文字をエスケープ
未設定サブドメインへのアクセスは、403
経緯やtips的なナニか
さてさて、できるだけ簡潔にわかりやすくを心がけたらガッチガチの文章になってしまった。
ついてきてますかぁ??
とにかく苦労したのは、リライトのコーディング。ネットに転がるコードをコピペすれども期待通りに動かない。正規表現は、暗号にしか見えずドコを修正すればいいかもわからない。
えぇ、勉強しましたよ。正規表現。
そして修正できたはずなのに、通りませんよ。
どうも後方参照がうまくいっていないらしい。テスト環境がアパッチ2.4なので、その公式を参照すると「!」と「%N」は同時に使えないらしい。
しかも、書き換えた内容でもう一度サーバーに問い合わせを行うので、条件をキッチリ指定しないと無限ループにハマる仕様なことも判明。てっきりコードの最後に[END]を置けば終了するものと思ってた。
そこでコードの先頭付近に、条件を満たせば書き換えしないよう指定。。。
指定できません!!
・・、ナゾです。
ここで、ようやく本気でエラーログを見ることを決意。いえ、今までも試みたんです。でも、ログファイル開いてもドコをどう見ればいいのかわからない。。
しかし「エラーログをデバグモードにしたくても.htaccess で設定できない。」って意味の一文を発見したので、色々間違ってた事を知る。
httpd.conf ファイルを「error」で検索し、コメントを読むもよくわかりません。公式へGO!
初期値の「LogLevel warn」を
LogLevel debug rewrite:trace8
これで error.log にやたらめったら記録されます。デバグが終了したら、元に戻そう。
で、ログファイルを読み込んで RewriteCond の条件パターンに後方参照のつもりで置いた「%1」がそのまま表示されてることを発見。
そもそもRewriteCond の条件パターンでは、後方参照使えないのね。。「!」と共には使えないんだと思ってたよ。
別の方法を考えなくては、、
で、[END]の挙動を調べてた時にリダイレクトステイタスがウンタラカンタラ、ってあったことを思い出し、ググる。
ありました。できました。ログファイルを見ても期待通りにHTTPステイタスが200を返したトコで、書き換え終了。おめでとう♪
コメントを残す